gpt4 book ai didi

java - 重用类实例而不重新创建它们

转载 作者:行者123 更新时间:2023-11-29 05:38:05 25 4
gpt4 key购买 nike

我有一堆我已经加载的类,并且已经在这些类上完成了 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;
}

注意:我之前有一篇关于类加载的帖子,但是这两篇帖子背后的问题并不相同。

最佳答案

您可以只使用 HashMap 来存储对象

public static HashMap<Class, Object> instances = new HashMap<Class, Object>();
public Object getInstance(Class clazz) {
if (instances.constainsKey(clazz)) {
return instances.get(clazz);
} else {
Object o = clazz.newInstance();
instances.put(clazz, o);
return o
}
}

但我实际上并不理解其目的,似乎有更好的方法来解决您的问题。

关于java - 重用类实例而不重新创建它们,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18711423/

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