Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 动态重新加载jar文件内容_Java_Dynamic_Bytecode_Dynamic Class Loaders - Fatal编程技术网

Java 动态重新加载jar文件内容

Java 动态重新加载jar文件内容,java,dynamic,bytecode,dynamic-class-loaders,Java,Dynamic,Bytecode,Dynamic Class Loaders,我的应用程序的类路径中有一个jar文件。在运行时,我向jar文件添加新类,有时还修改现有类的字段/方法。目前我正在使用URLClassLoader动态加载类。动态添加的新类被正确加载,我能够在运行时使用它们。但它无法重新加载在运行时修改的现有类。我读过许多文章,其中指出我们需要显式地处理重载,因为类一旦被加载,在所有对该类的引用被销毁之前不会被重载。我还尝试了我找到的示例代码,但没有一个有效 有人能给我建议一个重新加载的正确方法吗?任何相同的示例代码都将受到高度赞赏 通常,要重新加载类,需要卸载

我的应用程序的类路径中有一个jar文件。在运行时,我向jar文件添加新类,有时还修改现有类的字段/方法。目前我正在使用URLClassLoader动态加载类。动态添加的新类被正确加载,我能够在运行时使用它们。但它无法重新加载在运行时修改的现有类。我读过许多文章,其中指出我们需要显式地处理重载,因为类一旦被加载,在所有对该类的引用被销毁之前不会被重载。我还尝试了我找到的示例代码,但没有一个有效


有人能给我建议一个重新加载的正确方法吗?任何相同的示例代码都将受到高度赞赏

通常,要重新加载类,需要卸载整个类加载器。i、 删除对该类加载器加载的所有类的所有引用

另一种选择是使用检测来更改现有类的字节码。这通常是有限制的,更改字段是您无法做到的。i、 这种类型的对象必须以某种方式进行翻译

我通常做的是提供启动/重启速度非常快的服务。通过这种方式,您可以轻松地重新启动需要更新代码的进程,理想情况下,可以按my IDE中的
Run
。这也最大限度地减少了部署时间

  • 原则上,已经加载的类不能用同一个类加载器重新加载
  • 对于新加载,有必要创建一个新的类加载器,从而加载该类
  • 使用
    URLClassLoader
    有一个问题,那就是jar文件保持打开状态
  • 如果通过
    URLClassLoader
    的不同实例从一个jar文件加载了多个类,并且在运行时更改了jar文件,则通常会出现以下错误:
    java.util.zip.ZipException:ZipFile无效LOC头(错误签名)
    。错误可能不同
  • 为了避免出现上述错误,必须使用给定的jar文件对所有
    URLClassLoader
    s使用
    close
    方法。但这是一个实际导致整个应用程序重新启动的解决方案

  • 更好的解决方案是修改
    URLClassLoader
    ,以便将jar文件的内容加载到RAM缓存中。这不再影响从同一jar文件读取数据的其他
    URLClassloader
    s。然后,可以在应用程序运行时自由更改jar文件。例如,您可以使用对
    URLClassLoader
    的修改来实现以下目的:

    发布您的代码。我已经在我的一个项目中做了类似的事情。只有当我看到代码时,我才能帮助你。你能给我一些重新加载类的示例工作代码吗。这真的很有帮助。我尝试了文章中介绍的一些方法,但没有成功。你能确认你愿意卸载类加载器和任何加载的类吗?我向你们展示一个你们不能使用的复杂例子是毫无意义的。是的,我愿意卸载它。你能提供一些有帮助的示例吗?创建一个实例计数器以确保没有活动实例