我的工厂类有一个类的集合,我不想要依赖,当我添加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());
}
}
被实例化的每个子类都将自己添加到子类集合中。然后你的工厂就可以使用这套设备了。您所要做的就是确保所有的子类都在某个时刻被实例化——可能是使用配置文件,或者通过系统其他部分的启动动作。