私はすでにロードし、すでにクラスで newInstance() を実行した一連のクラスを持っています。newInstance() を再度実行する必要なく、これらのクラスを再利用し、現在の状態も再利用したいと考えています。すでにインスタンス化されたクラスを再作成せずに再利用できるように、 newInstance() の使用を置き換える方法はありますか (したがって、すべての状態が失われます)。どうすればいいですか?
List<Class> classes = null;
private void parseCP(File loadPath) {
try {
// Convert loading path to a URL
URL url = loadPath.toURI().toURL();
URL[] urls = new URL[]{url};
// Create a new class loader with the directory
ClassLoader cl = new URLClassLoader(urls);
classes = getClassesFromFolder(loadPath.getPath(), cl);
System.out.println("Classes discovered: " + classes.size());
for (Class i : classes) {
System.out.println("Looking into class: " + i.getName());
Object obj = i.newInstance();
// Call load() to get HttpFunctions to register their main and sub functions.
Method loadMethod = i.getMethod("load", null);
Object loadRes = loadMethod.invoke(obj, null);
}
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException | IOException | NoSuchMethodException e) {
e.printStackTrace();
}
}
public Object invoke(String classname, String method, Object args) {
Object res = null;
try {
for (Class i : classes) {
if (i.getName().equals(classname)) {
Object obj = i.newInstance(); //<--- How do I NOT create newInstance but reuse them ?
Class[] cargs = new Class[1];
cargs[0] = Object.class;
Method loadMethod;
if (args != null) {
loadMethod = i.getMethod(method, cargs);
} else {
loadMethod = i.getMethod(method, null);
}
if (loadMethod != null) {
if (args == null) {
res = loadMethod.invoke(obj);
} else {
res = loadMethod.invoke(obj, args);
}
}
}
}
} catch (InstantiationException | IllegalAccessException | NoSuchMethodException | IllegalArgumentException | InvocationTargetException e) {
e.printStackTrace();
}
return res;
}
注: クラスローディングに関する以前の投稿がありますが、これら 2 つの投稿の背後にある問題は同じではありません。