gpt4 book ai didi

Java 使用 ClassLoader 重新加载代码时出现问题

转载 作者:搜寻专家 更新时间:2023-11-01 03:29:56 26 4
gpt4 key购买 nike

我最近发了一个帖子Update Java code during runtime在摆弄不同的示例代码和阅读教程几个小时后,我遇到了以下问题:

通过使用 ClassLoader,我能够在运行时使用 http://www.exampledepot.com/egs/java.lang/reloadclass.html 处的代码将局部变量从 Class MyVar1 更改为 Class MyVar2 ,但我无法用另一个版本的 MyVar2 替换该类 MyVar2

MyVar1MyVar2 都实现了一个接口(interface)VarInterface。主类使用 VarInterface 类型保存变量的实例。

我已经阅读了其他几个声称是正确的实现,但我无法让它工作。任何人都可以看到我在这里做错了什么吗?

主类循环:

    while(true){  
i++;
Thread.sleep(1000);
ui.ping();
if(i > 3)
replaceVar();
}

替换变量:

ClassLoader parentClassLoader = MyClassLoader.class.getClassLoader();
MyClassLoader classLoader = new MyClassLoader(parentClassLoader);
Class newClass = classLoader.loadClass("MyVar2");
ui = (VarInterface)newClass.newInstance();

MyClassLoader.loadClass:

public Class<?> loadClass(String what){
// Get the directory (URL) of the reloadable class
URL[] urls = null;
try {
// Convert the file object to a URL
File dir = new File(System.getProperty("user.dir")
+File.separator+"dir"+File.separator);
URL url = dir.toURL();
urls = new URL[]{url};
} catch (MalformedURLException e) {
}

// Create a new class loader with the directory
ClassLoader cl = new URLClassLoader(urls);

// Load in the class
Class cls = null;
try {
cls = cl.loadClass("MyVar2");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}

return cls;
}

前 3 次迭代 MyVar1.ping() 被调用,之后 MyVar2.ping() 被无限调用,即使我替换了 MyVar2.classMyVar2.java 文件。

最佳答案

我猜您正在使用两个类加载器。一是系统类加载器,其中包含大量代码。您的自定义类加载器使用系统类加载器作为其父级。您正在尝试让自定义类加载器替换系统类加载器中的类。事实上,自定义类加载器将委托(delegate)给父类而不是加载它自己的类。

您需要做的是确保系统类加载器不加载该类的任何实现。创建一个类加载器,加载类的实现并委托(delegate)给系统类加载器。要更改实现,请创建类加载器的另一个实例。

(使用 java.net.URLClassLoader.newInstance 可能更容易创建您自己的类加载器实现。)

关于Java 使用 ClassLoader 重新加载代码时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3080891/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com