我想做这样的事情:
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 代码转移到外部配置文件。 2019 年 5 月 10 日更新(11 年后!)根据@IvanNik 的回答 org.reflections看起来不错,现在有几个库可以帮助解决这个问题。@Luke Hutchison 的答案中的ClassGraph看起来也很有趣。答案中还有更多的可能性。
陈述我想要的另一种方式:我的 Animal 类中的静态函数查找并实例化从 Animal 继承的所有类——无需任何进一步的配置/编码。如果我必须配置,我还不如在 Animal 类中实例化它们。我理解,因为 Java 程序只是 .class 文件的松散联合,所以它就是这样。
有趣的是,这在 C# 中似乎相当微不足道。