繁体   English   中英

Java,运行时类重装

[英]Java, runtime class reloading

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

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

我知道我可以使用classLoader接口加载新类。 我似乎在寻找正确的“卸载”方法时遇到了麻烦。

如果没有剩余的引用,将像其他任何对象一样卸载类并进行垃圾回收。 这意味着必须没有该类的可访问实例(由该特定的classloader实例加载),并且该classloader实例本身也必须符合垃圾回收的条件。

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

我相信您实际上需要具有一个类加载器的层次结构,并且要重新加载,实际上要摆脱低级类加载器(通过常规的GC手段),从而摆脱它加载的所有类。 据我所知,Java EE应用程序服务器使用此技术来重新加载应用程序,当在一个类加载器中加载的框架代码想要使用在其他地方加载的类时,就会有各种有趣的结果。

从2015年开始,java的类重载也是一个缺少的功能。

  • 使用OSGi创建类重载应用程序。
  • 使用jrebel进行测试。 还有其他一些人做同样的事情。
  • 使用应用程序服务器并将要重新加载的部分外部化到单独的Web应用程序中。 然后继续部署/取消部署。 由于旧的ClassLoader实例悬而未决,您最终将获得一些perm gen空间溢出错误。
  • 使用脚本运行器执行可变代码的一部分。 JSR-223 Java脚本API支持脚本语言“ Java”。

我写了一系列有关类重载的文章。 但是所有这些方法都不适合生产。

恕我直言,此类的重装在Java中很杂乱,不值得尝试。 但是我非常希望这是java中的规范。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM