我想这样做:
List<Animal> animals = new ArrayList<Animal>();
for( Class c: list_of_all_classes_available_to_my_app() )
if (c is Animal)
animals.add( new c() );
因此,我想查看应用程序中的所有类,当我找到一个从 Animal 继承的类时,我想创建一个该类型的新对象,并将其添加到列表中。这允许我添加功能,而不必更新事物列表。我可以避免以下情况:
List<Animal> animals = new ArrayList<Animal>();
animals.add( new Dog() );
animals.add( new Cat() );
animals.add( new Donkey() );
...
使用上面的方法,我可以简单地创建一个扩展 Animal 的新类,它将被自动拾取。
更新: 2008年10月16日上午9:00太平洋标准时间:
这个问题得到了很多很好的回答——谢谢。从回复和我的研究中,我发现我真正想做的事情在 Java 下是不可能的。有一些方法可以工作,比如 ddimitrov 的 ServiceLoader 机制——但是它们对于我想要的东西来说非常重要,我相信我只需要将问题从 Java 代码转移到一个外部配置文件。 更新5/10/19(11年后!)根据@IvanNik 的 回答 Org 反射看起来不错,现在有几个库可以帮助解决这个问题。同样来自@Luke Hutchison 的 回答的 课程表看起来也很有趣。答案中还有几种可能性。
另一种说明我想要什么的方法是: 在我的 Animal 类中使用一个静态函数来查找和实例化所有从 Animal 继承的类——不需要任何进一步的配置/编码。如果必须进行配置,我还不如直接在 Animal 类中实例化它们。我理解这一点,因为 Java 程序只是一个松散的。类文件,这就是它的方式。
有趣的是,这似乎是 C # 中的 微不足道。