4

是否可以以某种方式在类加载器中重新加载类字节码实现?我正在尝试在运行时向类添加方法。

4

1 回答 1

2

不,您不能在任何类加载器中重新加载类。

您可以做的是编写并使用一个自定义类加载器来加载该类的第一个版本。当你想更新类时,你处理第一个类的每个实例,它的 Class<> 对象的每个实例,以及加载第一个版本的类加载器。这是在 JVM 中卸载类的唯一方法——当 GC 收集所有这些东西(类的实例、Class<> 对象和加载类的 ClassLoader 的实例)时,它将被卸载。

然后,您实例化一个新的类加载器并加载您的类。

这类似于 Servlet 容器(例如 Tomcat)动态加载和卸载应用程序。

如果你只是想动态地添加方法,有一个类似的、非常有趣的方法,我之前使用过:你可以使用与类加载器关联的 Java Compiler API。您将类的“代码”传递给您的类加载器,它将调用 Java 编译器(如果需要,可以在内存中:您不需要写入磁盘上的任何文件),并使用类加载器来加载编译后的字节码。在任何情况下,如果你想卸载像这样加载的类,你将不得不丢弃类加载器,就像我上面描述的那样。

于 2013-02-25T17:53:17.120 回答