是否有可能以某种方式在类加载器中重新加载类字节码实现?我正在尝试在运行时向类中添加一个方法。
答案 0 :(得分:2)
不,你不能在任何类加载器中重新加载一个类。
您可以做的是编写并使用将加载该类的第一个版本的自定义类加载器。当你想要更新类时,你要处理第一个类的每个实例,它的Class<>的每个实例都是如此。对象,以及加载第一个版本的类加载器。这是在JVM中卸载类的唯一方法 - 当GC收集所有这些内容(类的实例,Class<>对象以及加载类的ClassLoader)时,它将被卸载。
然后,您实例化一个新的类加载器并加载您的类。
这类似于Servlet容器 - 例如Tomcat - 动态加载和卸载应用程序。
如果您只是尝试动态添加方法,那么我之前使用的方法类似,非常有趣:您可以使用与类加载器关联的Java Compiler API。您将类的“代码”传递给类加载器,它将调用Java编译器(如果需要,则在内存中:您不需要在磁盘上写入任何文件),并使用类加载器加载已编译的字节码。在任何情况下,如果你想卸载像这样加载的类,你将不得不丢弃类加载器,就像我上面描述的那样。