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

标签 java classloader dynamic-class-loaders

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

相关文章:

java - 如何通过 BOT 的 Ajax 调用进行保护?

java - 静态 block 中的 getResourceAsStream 有时返回 null

java - MyClassLoader.defineClass java.lang.SecurityException : Prohibited package name: java. lang

java - 系统类加载器的名称

java - 将 cglib BeanCopier 与多个类加载器一起使用

java - 循环依赖阻止在 Tomcat 上进行 war 部署

java - 编码 SOAP 消息时避免重复的命名空间

java - 存储在数组中并打印数组

java - Guice 如何将依赖项注入(inject)从动态加载的类实例化的对象