我正在开发智能卡测试仪。测试用例脚本文件是用java编写的。在这个测试器中,我有编辑器来编辑测试用例文件。编辑后,这些文件应该能够被编译,加载和实例化。
我已经使用JavaCompiler完成了编译工作。问题是关于装载。我使用URLClassLoader.newInstance来获取URLCLassLoader对象并动态加载我的.class。它运行良好,除非它不会重新加载类文件,即使案例文件已被编辑和编译。它使用旧版本的类文件并给出旧的结果。只有在我重新启动测试仪时才会加载新的类文件。
有没有办法让我使用URLClassLoader来控制类文件的重新加载?
非常感谢。
答案 0 :(得分:0)
在编辑器的保存操作中,调用您的加载类方法。
答案 1 :(得分:0)
加载一个类后,通常无法修改该类实例。唯一的选择是:
创建一个新的类加载器,加载该类的新副本,并更新对该类的旧版本以及该类的任何实例的所有引用。这可能很困难,这就是应用程序服务器环境中出现类加载器内存泄漏的原因。
使用JVMTI或Instrumentation重新定义已加载类的类字节。我不熟悉JVMTI,但Instrumentation.redefineClasses方法有很多限制:
重新定义可能会改变方法体,常量池和 属性。重新定义不得添加,删除或重命名字段或 方法,更改方法的签名或更改继承。 在将来的版本中可能会取消这些限制。类文件 字节不会被检查,验证和安装,直到之后 如果结果字节出错,则应用转换 这个方法会引发异常。