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

时间:2014-07-02 12:29:08

标签: java classloader

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

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

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

非常感谢。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

  1. 创建一个新的类加载器,加载该类的新副本,并更新对该类的旧版本以及该类的任何实例的所有引用。这可能很困难,这就是应用程序服务器环境中出现类加载器内存泄漏的原因。

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

  3.   

    重新定义可能会改变方法体,常量池和   属性。重新定义不得添加,删除或重命名字段或   方法,更改方法的签名或更改继承。   在将来的版本中可能会取消这些限制。类文件   字节不会被检查,验证和安装,直到之后   如果结果字节出错,则应用转换   这个方法会引发异常。