java - 在运行时,查找 Java 应用程序中扩展基类的所有类

标签 java reflection inheritance

我想做这样的事情:

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() );

所以,我想查看我的应用程序 Universe 中的所有类,当我找到一个派生自 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 的 answer,现在有几个库可以帮助解决这个问题org.reflections看起来不错。还有ClassGraph来自@Luke Hutchison 的answer看起来很有趣。答案中还有更多的可能性。

另一种表达我想要的方式:我的 Animal 类中的静态函数查找并实例化从 Animal 继承的所有类——无需任何进一步的配置/编码。如果我必须配置,我还不如在 Animal 类中实例化它们。我理解,因为 Java 程序只是 .class 文件的松散联合,所以它就是这样。

有趣的是,这似乎是 fairly trivial在 C# 中。

最佳答案

我使用 org.reflections :

Reflections reflections = new Reflections("com.mycompany");    
Set<Class<? extends MyInterface>> classes = reflections.getSubTypesOf(MyInterface.class);

另一个例子:

public static void main(String[] args) throws IllegalAccessException, InstantiationException {
    Reflections reflections = new Reflections("java.util");
    Set<Class<? extends List>> classes = reflections.getSubTypesOf(java.util.List.class);
    for (Class<? extends List> aClass : classes) {
        System.out.println(aClass.getName());
        if(aClass == ArrayList.class) {
            List list = aClass.newInstance();
            list.add("test");
            System.out.println(list.getClass().getName() + ": " + list.size());
        }
    }
}

关于java - 在运行时,查找 Java 应用程序中扩展基类的所有类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/205573/

相关文章:

带有表盘外观的 Java slider

c# - 如何从字符串为 Lambda 表达式动态创建方法

c# - 如何通过反射识别抽象成员

C# - 在我没有编写的类中使用多态性

java - 访问对象(动态选择的)子类的函数

c++ - 具有关系的对象类型 - C++

Java在资源文件夹中写入.txt文件

java - 成品中的 printStackTrace()。什么时候以及为什么?

c++ - Qt/C++ 中的反射

java - arraylist 整数中出现意外结果 - pde