2

在我描述我的问题之前,让我说我怀疑我可能只是缺少要搜索的正确术语,这就是为什么我在 stackoverflor 上的搜索没有取得成果的原因。因此,答案的链接也将不胜感激。

我试图创建一个有工厂的库,我们称之为“MyFactory”。MyFactory 有一个方法可以返回抽象类“MySuper”的对象,但也有一个方法可以将可用的子类公开给“MySuper”。该库打算进行大量扩展,因此会经常添加“MySuper”的子类,然后重新编译库,并将其转储到使用它的应用程序的库文件夹中。

我想要的是能够将“MySuper”的子类添加到库中,并让“MyFactory”意识到它,最好不需要做任何事情,只需创建一个新的“MySuper”子类。

到目前为止,我使用反射使“MyFactory”创建“MySuper”类型的新实例,方法是将类名赋予方法,如下所示:

public MySuper getSuperObject(String name) {
    return (MySuper) Class.forName("my.package." + name).newInstance(); }

但是我怎样才能让工厂将所有“MySuper”类公开为一个字符串列表,以便使用该库的应用程序知道他们可以调用什么?我可以迭代包的内容吗?

我对解决方案持开放态度,最重要的部分是将来添加新的“MySuper”子类应该非常轻松。

谢谢 :-)

更新:

我只想指出,我找到了一个很好的 Java 库,它以一种简单的方式处理反射,并允许您搜索特定类的子类型。所以我的问题可以用那个库来解决(我已经测试过了)。这是一个链接:http ://code.google.com/p/reflections/

4

3 回答 3

1

您正在寻找一个Generic Factory Pattern. 就像是..

public static <T extends MySuper> T createDocument(Class<T> subClazz) throws InstantiationException, IllegalAccessException {
        return subClazz.newInstance();
    };

你可以googleGeneric Factory Pattern一下,你会发现很多例子。

于 2012-11-07T09:36:39.660 回答
1

默认类加载器在搜索类之前对它一无所知。然后它会根据类路径在几个地方查找。如果您依赖于类加载器,您将无法将该类添加到列表中,直到它已经被按名称请求。

最自动化的解决方案可能是为扩展 MySuper 的新类指定一个位置,例如一个目录。要构建类列表,请在该目录中查找类文件,并使用您最喜欢的字节码库检查它们是否有扩展 MySuper 的类。

另一种选择是拥有一个列出扩展类名称的配置文件。

于 2012-11-07T10:14:03.973 回答
0

我建议创建一个包含 MySuper 可能子类的枚举。每当您添加一个子类时,在枚举中添加一个相同的条目,然后您可以将其作为 getMySuperObject() 方法的输入。

如果您认为我在此解决方案中留下了一些东西,请发表评论

于 2012-11-07T09:33:33.553 回答