Java,运行时类重新加载

Java,运行时类重新加载,java,class,reloading,Java,Class,Reloading,我正在寻找一种在运行时将类重新加载到Java中的方法。其动机是提高调试效率。该应用程序是一种典型的客户端/服务器设计,可同步处理请求。为每个请求实例化一个处理程序对象。这是我打算动态替换的唯一类。由于每个请求都处理一个新实例,因此重新加载此类不会产生任何副作用。简而言之,我不希望每次对此模块进行更改时都重新启动整个应用程序 在我的设计中,Java进程意识到在请求之间的类路径中有一个.class文件被更新。发生这种情况时,将卸载处理程序类并加载新的处理程序类 我知道我可以使用classLoader

我正在寻找一种在运行时将类重新加载到Java中的方法。其动机是提高调试效率。该应用程序是一种典型的客户端/服务器设计,可同步处理请求。为每个请求实例化一个处理程序对象。这是我打算动态替换的唯一类。由于每个请求都处理一个新实例,因此重新加载此类不会产生任何副作用。简而言之,我不希望每次对此模块进行更改时都重新启动整个应用程序

在我的设计中,Java进程意识到在请求之间的类路径中有一个.class文件被更新。发生这种情况时,将卸载处理程序类并加载新的处理程序类


我知道我可以使用classLoader接口加载新类。我似乎很难找到合适的卸货方式

类将像任何其他对象一样被卸载和垃圾收集,如果没有对它们的剩余引用。这意味着该特定类加载器实例加载的类必须没有可访问的实例,并且类加载器实例本身也必须符合垃圾收集的条件


因此,基本上,您所要做的就是创建一个新的类加载器实例来加载新版本的类,并确保没有对旧版本实例的引用保留下来。

我认为您实际上需要一个类加载器的层次结构,为了重新加载,您实际上通过normall-GC方法除去了低级类加载器,从而去掉了它加载的所有类。据我所知,Java EE应用服务器使用这种技术重新加载应用程序,当一个类加载器中加载的框架代码想要使用其他地方加载的类时,会产生各种有趣的结果。

截至2015年,Java的类重新加载也是一个缺失的功能

使用OSGi创建类重新加载应用程序。 使用jrebel进行测试。还有一些人做同样的事情。 使用ApplicationServer并将要重新加载到单独web应用程序中的部分外部化。然后继续部署/取消部署。由于挂起旧的类加载器实例,最终会出现一些perm gen空间溢出类错误。 使用脚本运行程序执行部分可更改代码。JSR-223 Java脚本API支持Java脚本语言。 我写了一系列关于重新加载类的文章。但所有这些方法都不利于生产

和源代码
在java中,这个类的重新加载是混乱的,不值得尝试。但我非常希望这是一个java规范

您是否尝试过在调试器中使用hot deloyment工具?