[英]Java: Factory method with reflection?
我的工廠類有一個類的集合,我不希望這種依賴關系,當我添加超類的子類時,我需要工廠文件保持不變
編輯:我的工廠類必須返回所有超類的子類實例,但是我不能擁有它們的集合(或它們的名稱),因為這意味着每當我添加新的子類時,我都必須更改Factory文件!
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世界站點。 它通過一個程序包,加載類,並對其進行測試以查看是否有任何子類。
如果要搜索一個類的所有子類,可以使用反射,如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());
}
}
被實例化的每個子類都將自己添加到該子類集合中。 然后,您的工廠可以使用該組。 您要做的就是確保在某個時刻實例化所有子類-可能使用配置文件,或者通過系統其他部分的啟動操作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.