私は最近、実行時にJavaコードを更新する投稿を作成し、数時間さまざまなサンプルコードをいじり、チュートリアルを読んだ後、次の問題に遭遇しました。
ClassLoader を使用することで、実行時にhttp://www.exampledepot.com/egs/java.lang/reloadclass.htmlMyVar1
のコードを使用してローカル変数を ClassからClass に変更できましたが、置き換えることができませんでしたの別のバージョンを持つそのクラス。MyVar2
MyVar2
MyVar2
と インターフェイスの両方MyVar1
をMyVar2
実装しますVarInterface
。メイン クラスは、 type を使用して変数のインスタンスを保持します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.class
MyVar2.java