Java 如何使用URLClassLoader重新加载已更改的类文件

Java 如何使用URLClassLoader重新加载已更改的类文件,java,classloader,Java,Classloader,我正在开发智能卡测试仪。测试用例脚本文件是用java编写的。在这个测试仪中,我有用于编辑测试用例文件的编辑器。在编辑之后,这些文件应该能够被编译、加载和实例化 我已经使用JavaCompiler完成了编译工作。问题在于装载量。我使用URLClassLoader.newInstance获取URLClassLoader对象,并动态加载我的.class。它工作得很好,只是即使案例文件已被编辑和编译,它也不会重新加载类文件。它使用类文件的旧版本并给出旧结果。仅当我重新启动测试仪时,它才会加载新的类文件

我正在开发智能卡测试仪。测试用例脚本文件是用java编写的。在这个测试仪中,我有用于编辑测试用例文件的编辑器。在编辑之后,这些文件应该能够被编译、加载和实例化

我已经使用JavaCompiler完成了编译工作。问题在于装载量。我使用URLClassLoader.newInstance获取URLClassLoader对象,并动态加载我的.class。它工作得很好,只是即使案例文件已被编辑和编译,它也不会重新加载类文件。它使用类文件的旧版本并给出旧结果。仅当我重新启动测试仪时,它才会加载新的类文件

我有没有办法通过使用URLClassLoader来控制类文件的重新加载


非常感谢。

在编辑器的保存操作中,调用加载类方法。

加载类后,通常无法修改该类实例。唯一的选择是:

  • 创建新的类加载器,加载该类的新副本,并更新对该类的旧版本和该类的任何实例的所有引用。这可能很困难,这就是为什么类加载器内存泄漏发生在应用服务器环境中

  • 使用JVMTI或重新定义已加载类的类字节。我对JVMTI不太熟悉,但是Instrumentation.redefineClasses方法有很多限制:

  • 重新定义可能会改变方法体、常量池和 属性。重新定义不得添加、删除或重命名字段或 方法、更改方法的签名或更改继承。 这些限制可能会在未来的版本中取消。类文件 直到 如果生成的字节出错,则已应用转换 此方法将引发异常


    谢谢你的回答。根据您的建议,似乎每次需要重新加载新版本类时,我都会创建一个新的URLClassLoader对象来解决这个问题。它确实加载了新编译的类文件。我担心这会引起任何问题吗?测试人员用户通常使用它几个小时,他们可能会创建数百个ClassLoder。当我决定创建一个新的类加载器时,我已经将它们设置为null,我知道java垃圾收集器将处理这个问题,但我仍然担心这一点。我将观察表演,稍后在这里再次发表评论。