当前位置: 首页 > 面试题库 >

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

曹恩
2023-03-14
问题内容

我想做这样的事情:

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的新类,它将自动被拾取。

更新:10/16/2008 9:00 AM太平洋标准时间:

这个问题引起了很多反响-谢谢。 从响应和研究中,我发现我真正想做的事在Java下是不可能的。有一些方法可以使用,例如ddimitrov的ServiceLoader机制,但是对于我想要的东西,它们非常繁琐,我相信我只是将问题从Java代码转移到了外部配置文件中。 更新5/10/19(11年后!)根据@IvanNik的回答 ,现在有几个库可以帮助解决此问题。org.reflections看起来不错。此外ClassGraph从@Luke和记黄埔的答案看起来很有趣。答案中还有其他几种可能性。

声明我想要的另一种方式:Animal类中的静态函数查找并实例化了从Animal继承的所有类-无需任何进一步的配置/编码。如果必须进行配置,无论如何,我还是可以在Animal类中实例化它们。我知道这是因为Java程序只是.class文件的松散联合,而事实就是如此。

有趣的是,这似乎在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());
        }
    }
}


 类似资料:
  • 问题内容: 我有能力在编译时扩展一个类,但是我需要能够在运行时使用已实例化的超类的实例创建此子类的实例。 从理论上讲这应该是可能的,因为已经在子类构造函数之前调用了超类构造函数。 我没有足够的程序访问权限来更改实例化到我的子类或中断原始实例化。 用例:现有一个类X实例的数组。我的代码在之后加载。我需要使用已加载的子类Y扩展X来覆盖实例X之一的方法之一。父程序仅通过该数组访问对象,因此我想用Y实例替

  • 问题内容: 我试图找到Java运行时可用的所有类的名称,并在Guava中使用反射将代码成功实现了一些成功,例如: 这似乎在某种程度上可以使我获得大约2500个类名,但是并没有找到所有的类名,特别是我确实需要了解的所有类,特别是java.lang,java.util等。 我应该为此使用其他类加载器吗?我也尝试过 任何指针将不胜感激。谢谢 恩文 我从这篇文章中使用了更多信息:如何列出特定类加载器中加载

  • 问题内容: 所以对于这个项目,我试图在运行时扩展一个类。我想知道,这有可能吗?如果是这样,我该怎么办?是否有用于这些目的的库? 问题答案: CGLib是您要查找的库。它在扩展类或在运行时实现接口方面非常强大,因此许多流行的框架(如Spring或Hibernate)都使用它。 您可以使用以下代码创建类扩展 尽管您可能会使用具有所需逻辑的有用的方法拦截器替换回调。

  • 问题内容: 在Java中,默认情况下所有类都扩展了任何默认类吗? 示例:如果我有一个简单的课程,例如: 此类默认情况下是否扩展了类? 问题答案: class是所有类的超类。 类对象是类层次结构的根。每个类都有Object作为超类。所有对象(包括数组)都实现此类的方法。 您可以测试一下:

  • 问题内容: 获取运行Java应用程序时使用的所有类的列表的最简单方法是什么? 假设通过运行来调用: 运行该程序后,我想列出运行该程序时使用过的所有类: 在这种情况下,如果某个类已在程序执行期间由类加载器加载,并且如果存在此类静态块,则该类的静态块将被运行,则将该类定义为正在使用。 问题答案: 使用标志 verbose:class* 运行Java * 要将其附加到文件中: 等等 它还列出了定义这些文

  • 问题内容: 我有一个正在使用的Java应用程序,但我刚刚意识到该程序必须在不到一分钟的时间内返回一个值,但不知道如何查找或显示运行该程序所花费的时间。如何找到运行程序所需的时间? 问题答案: 您可以使用比较时间。它将返回时间(以纳秒为单位)。 返回最精确的可用系统计时器的当前值,以纳秒为单位。 您可以这样使用它: 有用的链接: