Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:带反射的工厂方法?_Java_Reflection_Factory_Factory Pattern - Fatal编程技术网

Java:带反射的工厂方法?

Java:带反射的工厂方法?,java,reflection,factory,factory-pattern,Java,Reflection,Factory,Factory Pattern,我的工厂类有一个类的集合,我不希望有这种依赖关系,当我添加超类的子类时,我需要工厂文件保持不变 编辑: 我的工厂类必须返回所有超类的子类实例,但我不能拥有它们的集合或它们的名称,因为这意味着每当我添加新的子类时,我都必须更改工厂文件 package reflection; public final class Factory { private final SuperClass[] subclasses_collection = {new SubClass1

我的工厂类有一个类的集合,我不希望有这种依赖关系,当我添加超类的子类时,我需要工厂文件保持不变

编辑: 我的工厂类必须返回所有超类的子类实例,但我不能拥有它们的集合或它们的名称,因为这意味着每当我添加新的子类时,我都必须更改工厂文件

package reflection;

public final class Factory {

    private final SuperClass[] subclasses_collection 
            = {new SubClass1(), new SubClass2() /* ...SubClassN */};

    public final SuperClass[] getAllSubClasses() {
        return subclasses_collection;
    }
}
而不是

new SubClass1()
做这样的事

Class clazz = Class.forName("SubClass1");
Object subclass1 = clazz.newInstance();
如果要将参数传递给构造函数,请参阅本文的“创建新对象”一节 而不是

new SubClass1()
做这样的事

Class clazz = Class.forName("SubClass1");
Object subclass1 = clazz.newInstance();
如果要将参数传递给构造函数,请参阅本文的“创建新对象”一节

要找到给定类的所有子类,我要查看java world站点。它通过一个包,加载类,并测试它们是否有子类。

要找到给定类的所有子类,我会查看java world站点。它遍历一个包,加载类,并测试它们是否有任何子类。

如果要搜索一个类的所有子类,可以使用反射,正如Jeffrey所说。然而,与其自己编写代码,或者从一些随机文章中复制和粘贴代码,我更愿意使用,它可以完全满足您的需要

类路径扫描的替代方法是在运行时建立注册表。您可以创建如下所示的基类:

public abstract class SuperClass {
    private static final Set<Class<? extends SuperClass>> SUB_CLASSES = new HashSet<Class<? extends SuperClass>>();

    /* instance initializer */ {
        SUB_CLASSES.put(getClass());
    }
}

实例化的每个子类都会将自己添加到子类集合中。然后,您的工厂可以使用该设备。你所要做的就是确保所有的子类都在某个时刻被实例化——可能是使用配置文件,或者通过系统其他部分的启动操作。

如果你想搜索一个类的所有子类,你可以使用反射,正如Jeffrey所说。然而,与其自己编写代码,或者从一些随机文章中复制和粘贴代码,我更愿意使用,它可以完全满足您的需要

类路径扫描的替代方法是在运行时建立注册表。您可以创建如下所示的基类:

public abstract class SuperClass {
    private static final Set<Class<? extends SuperClass>> SUB_CLASSES = new HashSet<Class<? extends SuperClass>>();

    /* instance initializer */ {
        SUB_CLASSES.put(getClass());
    }
}

实例化的每个子类都会将自己添加到子类集合中。然后,您的工厂可以使用该设备。您所要做的就是确保所有的子类都在某个时刻实例化—可能使用配置文件,或者通过系统其他部分的启动操作来实例化。

这个类不是一个特例。和问题是什么?@JB Nizet我想他想知道如何在运行时通过反射找到给定类的所有子类。我想OP只是想通过反射创建实例。我还以为OP会知道要实例化的类的名称。这个类不是一个实例。和问题是什么?@JB Nizet我想他想知道如何在运行时通过反射找到给定类的所有子类。我想OP只是想通过反射创建实例。我还以为OP会知道要实例化的类的名称。不,我不想再次修改类工厂,这样做如果我添加一个子类,我仍然必须更改类工厂不,你不必这样做。您可以在创建时将子类的名称字符串传递给工厂,或者工厂可以从属性文件文本文件中读取。否,我不想再次修改类工厂,如果我添加子类,我仍然必须更改类工厂否,您不必这样做。您可以在创建子类时将子类的名称字符串传递给工厂,或者工厂可以从属性文件文本文件中读取它。