我想做类似这样的事情:
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() );
所以,我想查看应用程序宇宙中的所有类,并且当我找到一个继承自动物类的类时,我想创建一个该类型的新对象并将其添加到列表中。这样可以在不更新事物列表的情况下添加功能。我可以避免以下操作:List<Animal> animals = new ArrayList<Animal>();
animals.add( new Dog() );
animals.add( new Cat() );
animals.add( new Donkey() );
...
通过上述方法,我可以简单地创建一个扩展Animal的新类,它会自动被选中。
更新:2008年10月16日太平洋标准时间上午9点:
这个问题引起了很多出色的回复--谢谢。从回复和我的研究中,我发现在Java下我真正想做的事情是不可能的。有一些方法,比如ddimitrov的ServiceLoader机制可以工作——但对于我想要的东西来说太重了,我相信我只是将问题从Java代码移动到一个外部配置文件中。更新 5/10/19(11年后!)根据@IvanNik的回答,现在有几个库可以帮助处理这个问题,org.reflections看起来不错。同时根据@Luke Hutchison的回答, ClassGraph 也很有趣。还有几种可能性在答案中。
另一种陈述我想要的方式:我的Animal类中的静态函数找到并实例化所有继承自Animal的类——不需要进一步的配置/编码。如果我必须进行配置,那么我可能会在Animal类中直接实例化它们。我知道由于Java程序只是一组.class文件的松散联合,这就是事实。