簡體   English   中英

Java:帶有反射的工廠方法?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM