带有反射的工厂方法



我的工厂类有一个类的集合,我不想要依赖,当我添加SuperClass的子类时,我需要工厂文件保持不变

编辑:我的工厂类必须返回所有的超类的子类实例,但我不能有他们的集合(或他们的名字),因为这意味着我将不得不改变工厂文件每当我添加一个新的子类!

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();

如果要向构造函数传递参数,请参阅本文创建新对象一节http://java.sun.com/developer/technicalArticles/ALT/Reflection/

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

如果你想搜索一个类的所有子类,你可以使用反射,正如Jeffrey所说。然而,比起自己编写代码,或者从一些随机的文章中复制粘贴它,我会使用Stripes web框架中的ResolverUtil,它确实是你想要的(以及更多!)。

类路径扫描的另一种选择是在运行时构建注册表。您可以这样创建一个基类:

public abstract class SuperClass {
    private static final Set<Class<? extends SuperClass>> SUB_CLASSES = new HashSet<Class<? extends SuperClass>>();
    /* instance initializer */ {
        SUB_CLASSES.put(getClass());
    }
}

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

相关内容

  • 没有找到相关文章

最新更新