首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

热加载原理解析与实现

动态链接使用的是java attach模块的功能,链接的同时会加载hotreload-agent。...,然后通过反射生成对象使用ASM修改class文件;重定义原始类,先将原来的类变成接口每次类变更,需要重新new一个类加载器,开销太大使用ASM修改class文件;让每次加载的类都保存成一个带有版本信息的...改变 JDK classloader的加载行为,使它指向自定义加载器的加载行为,对代码侵略性太强使用Java Agen;在 JVM 启动之后,应用启动之前,拦截默认加载器,使用自定义类加载进行加载,替换默认加载的...通过修改类名,避免类加载时出现类对象相同的问题(比如,让每次加载的类都保存成一个带有版本信息的 class)。// 在 class 文件发生改变时重新定义这个类private Class时,默认加载程序的是AppClassLoader,并不会用自定义的加载器加载 classpath下的所有 class 文件,如果之后用自定义加载器重新加载已经加载的 class,有可能会出现

5.7K30

探索 Java 热部署的奥妙

改变创建对象的行为,使他们在创建时使用自定义 classloader 加载的 class。 自定义加载器的实现 自定义加载器仍然需要执行类加载的功能。...利用 ASM 修改 class 文件 可以修改字节码的框架有很多,比如 ASM,CGLIB。本文使用的是 ASM。...定义一个派生类 // 在 class 文件发生改变时重新定义这个类 private Class使用 JavaAgent 拦截默认加载器的行为 之前实现的类加载器已经解决了热部署所需要的功能,可是 JVM 启动时,并不会用自定义的加载器加载 classpath 下的所有 class 文件,取而代之的是通过应用加载器去加载...如果在其之后用自定义加载器重新加载已经加载的 class,有可能会出现 LinkageError 的 exception。所以必须在应用启动之前,重新替换已经加载的 class。

83550
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    深入探索 Java 热部署

    改变创建对象的行为,使他们在创建时使用自定义 classloader 加载的 class。 自定义加载器的实现 自定义加载器仍然需要执行类加载的功能。...利用 ASM 修改 class 文件 可以修改字节码的框架有很多,比如 ASM,CGLIB。本文使用的是 ASM。...定义一个派生类 // 在 class 文件发生改变时重新定义这个类 private Class使用 JavaAgent 拦截默认加载器的行为 之前实现的类加载器已经解决了热部署所需要的功能,可是 JVM 启动时,并不会用自定义的加载器加载 classpath 下的所有 class 文件,取而代之的是通过应用加载器去加载...如果在其之后用自定义加载器重新加载已经加载的 class,有可能会出现 LinkageError 的 exception。所以必须在应用启动之前,重新替换已经加载的 class。

    1K10

    解决java.lang.IncompatibleClassChangeError异常的正确方法

    正文 问题分析 java.lang.IncompatibleClassChangeError是LinkageError的子类,表示类的二进制兼容性变化导致类无法正确加载。...字节码操控:使用第三方库(如ASM、Javassist)对字节码进行修改时,导致类定义不一致。...检查类加载器 确保类加载器正确加载类定义,特别是在使用自定义类加载器或多重类加载器环境中。...审查字节码操作 在使用字节码操作库(如ASM、Javassist)时,确保对类结构的修改是合理的,并且不会引起二进制兼容性问题。...A: 当类或接口的二进制兼容性发生变化,但没有重新编译所有依赖该类的代码时,容易出现此异常。 Q: 如何避免此类异常?

    28010

    从Java的类加载机制谈起:聊聊Java中如何实现热部署(热加载)

    改变创建对象的行为,使他们在创建时使用自定义 classloader 加载的 class。 自定义加载器的实现 自定义加载器仍然需要执行类加载的功能。...利用 ASM 修改 class 文件 可以修改字节码的框架有很多,比如 ASM,CGLIB。本文使用的是 ASM。...如果在其之后用自定义加载器重新加载已经加载的 class,有可能会出现 LinkageError 的 exception。所以必须在应用启动之前,重新替换已经加载的 class。...例如,我们支持动态实时地在Spring中添加bean和依赖,以及支持在其他框架中所做的各种各样的改变。 结论 本文总结了在未使用动态类加载器情况下的各种重载Java类的方法。...我们还讨论了导致HotSwap局限性的原因,揭示了JRebel幕后的工作方式,以及讨论了在解决类重载问题时出现的其他问题。

    3.3K20

    【读码JDK】-java.lang包介绍

    当Java虚拟机检测到正在加载类的超类存在循环时,抛出 ClassFormatError 当Java虚拟机尝试读取类文件并格式化错误或者无法解析类文件时,抛出 ClassLoader 类加载器是一个负责加载类的对象...: 系统类加载器,也称为应用程序类加载器,加载指定的应用程序类路径,模块路径或者JDK指定工具上定义的类 ClassNotFoundException 当应用程序尝试使用以下命令通过其字符串名称加载类时抛出...例如,如果动态语言需要为消息发送调用站点遇到的每个类构造消息调度表,则可以使用ClassValue来缓存为遇到的每个类快速执行消息发送所需的信息。...Java new构造来实例化抽象类或接口时,抛出该异常 InstantiationException 当应用程序尝试使用Class的newInstance方法创建类的实例时抛出,但无法实例化指定的类对象...如果Java虚拟机或ClassLoader实例尝试加载类的定义(作为普通方法调用的一部分或作为使用new表达式创建新实例的new ),则new该类,并且无法找到该类的定义。

    1.6K20

    JVM 看这一篇就够了

    args_size:参数个数,为1的话,因实例方法默认会传入this,locals也会预留一个slot来存放 ASM “参考博文 ASM概述 ASM是一个Java字节码操纵框架,它能被用来动态生成类或者增强既有类的功能...ASM可以直接产生二进制class文件,也可以在类被加载入虚拟机之前动态改变类行为,ASM从类文件中读入信息后,能够改变类行为,分析类信息,甚至能根据要求生成新类 目前许多框架如 cglib、Hibernate...“首次主动使用”的时候才加载它,JVM规范允许类加载器在预料到某个类将要被使用的时候就预先加载它 如果在加载的时候 .class 文件缺失,会在该类首次主动使用时报告 LinkageError 错误,如果一直没有被使用...,不同的命名空间,可以出现类的全路径名 相同的情况 运行时包由同一个类加载器的类构成,决定两个类是否属于同一个运行时包,不仅要看全路径名是否一样,还要看定义类加载器是否相同。...程序对类的使用方式分成:主动使用和被动使用,JVM 必须在每个类或接口 ”首次主动使用“ 时才初始化它们;被动使用类不会导致类的初始化,主动使用的情况: 创建类实例 访问某个类或接口的静态变量 调用类的静态方法

    51320

    类加载常见错误总结,写得非常好!

    ClassNotFoundException 是一个 exception 类,同时发生在主动执行动态加载时,所以我们应该去 catch 它,防止发生一些运行时错误。...LinkageError LinkageError 相比较之前几种错误不那么常见,只有多个类加载器同时作用交互时才会出现。...我们知道 jvm 中一个类由全限定类名与类加载器确定类实例,那么不同类加载器加载的同一个类是属于不同类实例的,然后在内存中如果两者发生交互,就会出现 LinkageError 异常。...一般情况下,jvm 加载类都会遵循之前所述的双亲委派原则,不太可能出现一个类有不同类加载器加载的情况。...还有一种比较常见的情况是进行自定义类加载器开发时遇到。

    1.1K10

    解决java.lang.NoClassDefFoundError错误

    NoClassDefFoundError发生在JVM在动态运行时,根据你提供的类名,在classpath中找到对应的类进行加载,但当它找不到这个类时,就发生了java.lang.NoClassDefFoundError...jar文件的manifest文件中的classpath属性中定义 3、可能程序的启动脚本覆盖了原来的classpath环境变量 4、因为NoClassDefFoundError是java.lang.LinkageError...:23) 由于NoClassDefFoundError是LinkageError的子类,而LinkageError的错误在依赖其他的类时会发生,所以如果你的程序依赖原生的类库和需要的dll不存在时,有可能出现...,如果你的程序运行在像linux这样多用户的操作系统种,你需要把你应用相关的资源文件,如Jar文件,类库文件,配置文件的权限单独分配给程序所属用户组,如果你使用了多个用户不同程序共享的jar包时,很容易出现权限问题...这会导致的结果就是对User类出现NoClassDefFoundError异常,而如果在两个JAR包中这个User类都存在,如果你使用equals方法比较两个类的对象时,会出现ClassCastException

    41310

    Java 类加载器解析及常见类加载问题

    类加载器层次结构 每当启动新的 JVM 时,引导类加载器(bootstrap classloader)负责首先将关键 Java 类(来自 Java.lang 包)和其他运行时类加载到内存中。...在 Java EE 中,查找的顺序通常是相反的:类加载器可能在转到父类之前尝试在本地查找类。...正如 Javadoc 条目所说,如果 Java 虚拟机或类加载器实例试图在类的定义中加载,而找不到类的定义,则抛出 NoClassDefFoundError。...这意味着,在编译当前执行的类时,搜索到的类定义存在,但在运行时找不到该定义。 这就是为什么你不能总是依赖你的 IDE 告诉你一切正常,代码编译应该正常工作。...在处理类加载器时,一个非常重要的原则是认识到类加载器的行为常常会破坏您的直观理解,因此验证您的假设非常重要。例如,在 LinkageError 的情况下,查看代码或构建过程将阻碍而不是帮助您。

    99930

    【胖虎的逆向之路】01——动态加载和类加载机制详解

    胖虎的逆向之路 01——动态加载和类加载机制详解 一、前言 之前一直了解到加壳脱壳,直接使用Fart等脱壳工具进行的,停留在知其然不知其所以然的层次,所以以此准备进行Android 基础理论的学习中,首先要深入理解类加载器和动态加载二者之间的关系...(1) 防止同一个.class文件重复加载 (2) 对于任意一个类确保在虚拟机中的唯一性.由加载它的类加载器和这个类的全类名一同确立其在Java虚拟机中的唯一性 (3) 保证.class文件不被篡改...和自定义ClassLoader。...)初始化一个类的子类(会首先初始化子类的父类) 2.显式加载: (1)使用LoadClass()加载 (2)使用forName()加载 显式加载中有两种办法,两种办法有些许不同噢 (1)ClassLoader.loadclasss...,若已加载则直接返回,否则继续执行; (2)调用parent的类加载递归加载该类,检测是否加载,若已加载则直接返回,否则继续执行; (3)调用当前类加载器,通过findClass加载。

    72620

    jvm源码解析(八)动态代理是如何实现的,JDK Proxy于CGLib有什么区别

    动态代理常用实现方式是反射,是一种行为方式,而反射或ASM只是它的一种实现手段 反射机制: 程序在运行期间可以访问、检测和修改其本身状态或行为的一种能力,使用反射我们可以调用任意一个类对象,以及类对象中包含的属性及方法...唯一不同: CGLib在初始化被代理类时,是通过Enhancer对象把被代理对象设置为代理类的子类,来实现动态代理的功能,因此被代理类不能被设置为final Lombok是通过反射实现的吗 属于Java...的一个热门工具类 使用它可以有效的解决代码工程中那些繁琐又重复的代码(getter/setter,toString,equals,hashCode等方法) 在类上加@Data可以自动代理出上述的方法。...Annotation Processing API(插件式注解处理器)) 编码器自定义注解处理器实现的 ?...当Java将源码抽象成AST之后,Lombok会根据注解动态的修改AST增加新的代码,生成最终的源码 动态代理和静态代理有什么区别 静态代理其实就是事先写好代理类,可以手工编写,也可以工具生成 他的缺点是每个业务类都要有一个对应的代理类

    71230

    java类的加载机制

    类加载器并不需要等到某个类被“首次主动使用”时再加载它,JVM规范允许类加载器在预料某个类将要被使用时就预先加载它,如果在预先加载的过程中遇到了.class文件缺失或存在错误,类加载器必须在程序首次主动使用该类时才报告错误...(LinkageError错误)如果这个类一直没有被程序主动使用,那么类加载器就不会报告错误。...class文件 将Java源文件动态编译为.class文件 二、类的生命周期 类从被加载到JVM内存中开始到卸载出内存为止,生命周期分为7个阶段:加载-验证-准备-解析-初始化-使用-卸载。...虚拟机启动时被标明为启动类的类( JavaTest),直接使用 java.exe命令来运行某个主类 6、使用 7、结束生命周期 在如下几种情况下,Java虚拟机将结束生命周期 执行了 System.exit...双亲委派模式优势 采用双亲委派模式的是好处是Java类随着它的类加载器一起具备了一种带有优先级的层次关系,通过这种层级关可以避免类的重复加载,当父亲已经加载了该类时,就没有必要子ClassLoader再加载一次

    41120

    如何实现自己的ClassLoader

    java.lang.LinkageError com.hxuhao.model.User@6d6f6e28 Exception in thread "main" java.lang.LinkageError...但是需要注意的一点是,被这个Classloader加载的类的字节码会保存在JVM的PermGen区,这个数据一般只是在执行Full GC时才会被回收的,所以如果在你的应用中都是大量的动态类加载,FUll...Java应不应该动态加载类 我想大家都知道用JAVA有一个痛楚,就是修改一个类,必须重启一遍,很费时。...Java的优势正式基于共享对象的机制,达到信息的高度共享,也就是通过保存并持有对象的状态而省去类信息的重复创建和回收。我们知道对象一旦被创建,这个对象就可以被人持有和利用。...看起来好像对象可以被替换了, 但是这仍然不可行,因为它违反了JVM的设计原则,对象的引用关系只有对象的创建者持有和使用,JVM不可以干预对象的引用关系,因为JVM并不知道对象时怎么被使用的,这就涉及JVM

    1.4K10

    彻底搞懂Java动态代理

    代理类和实现类具有相同的接口,代理类通过实现类执行具体的方法。这样就出现了大量的代码重复。如果接口增加一个方法,除了所有实现类需要实现这个方法外,所有代理类也需要实现此方法。...第二节动态代理例子显然是这个能力的一个子集。 ? 有一些开源框架支持运行期生成二进制字节码这个功能,如ASM,Javassist ASM 是一个 Java 字节码操控框架。...能够以二进制形式修改已有类或者动态生成类。ASM可以直接产生二进制 class 文件,也可以在类被加载入Java虚拟机之前动态改变类行为。...Spring使用的CGLIB也采用ASM框架作为其字节码操作的工具。...3、为什么是InvocationHandler 我们已经具有能力动态修改一个类的代码,使用ASM哪怕生成一个非常简单的类,代码量也是又多又复杂。仔细思考代理模式中的代理Proxy角色。

    1.8K41

    实习杂记(27):如何解决Java.lang.NoClassDefFoundError

    NoClassDefFoundError发生在JVM在动态运行时,根据你提供的类名,在classpath中找到对应的类进行加载,但当它找不到这个类时,就发生了java.lang.NoClassDefFoundError...文件的manifest文件中的classpath属性中定义 可能程序的启动脚本覆盖了原来的classpath环境变量 因为NoClassDefFoundError是java.lang.LinkageError...,如果你的程序运行在像linux这样多用户的操作系统种,你需要把你应用相关的资源文件,如Jar文件,类库文件,配置文件的权限单独分配给程序所属用户组,如果你使用了多个用户不同程序共享的jar包时,很容易出现权限问题...我们在使用Spring MVC框架或者Apache Struts框架,在部署War文件或者EAR文件时就经常会出现Exception in thread “main” java.lang.NoClassDefFoundError...这会导致的结果就是对User类出现NoClassDefFoundError异常,而如果在两个JAR包中这个User类都存在,如果你使用equals方法比较两个类的对象时,会出现ClassCastException

    36.2K20

    自定义类加载器加载过Class文件被替换后如何生效

    写这篇文章的原因是因为在今天的面试中,聊到自己小程序后台在线编辑代码,其中涉及到防止非必要重启,我使用自定义类加载去加载某些类,然后面试官问到这样一个问题:如果你第一版的class文件放服务器上去被加载之后...这是因为每个被加载的Class都需要被链接(link),个人理解就是一个类加载器去加载相同限定名的Class时,就会抛出java.Lang.LinkageError....执行自定义的类cl.test.TestDyna 执行自定义的类cl.test.TestDyna Exception in thread "main" java.lang.LinkageError: loader...(TestXML.java:62) at cl.test.TestXML.main(TestXML.java:35) 走到这里就很好处理了,既然一个类加载器去加载相同限定名的Class时会出现问题,...那么就使用不同的类加载器来处理了。

    1.8K30

    彻底搞懂Java动态代理

    代理类和实现类具有相同的接口,代理类通过实现类执行具体的方法。这样就出现了大量的代码重复。如果接口增加一个方法,除了所有实现类需要实现这个方法外,所有代理类也需要实现此方法。...第二节动态代理例子显然是这个能力的一个子集。 ? 有一些开源框架支持运行期生成二进制字节码这个功能,如ASM,Javassist ASM 是一个 Java 字节码操控框架。...能够以二进制形式修改已有类或者动态生成类。ASM可以直接产生二进制 class 文件,也可以在类被加载入Java虚拟机之前动态改变类行为。...Spring使用的CGLIB也采用ASM框架作为其字节码操作的工具。...3、为什么是InvocationHandler 我们已经具有能力动态修改一个类的代码,使用ASM哪怕生成一个非常简单的类,代码量也是又多又复杂。仔细思考代理模式中的代理Proxy角色。

    95231
    领券