为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

HUX布斯 2019-07-27 14:15:49
在运行时,查找Java应用程序中扩展基类的所有类我想做这样的事: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() );...使用上面的方法,我可以简单地创建一个新的类,这个类扩展了Properties,它将自动被获取。更新日期:2008年10月16日上午9时。太平洋标准时间:现在有几个库可以在这方面提供帮助。回答 org.反射看上去不错。也类图来自卢克·和记黄埔回答看上去很有趣。答案中还有更多的可能性。另一种陈述我想要的东西的方法是:我的动物类中的一个静态函数查找并实例化了所有继承自动物的类-没有任何进一步的配置/编码。如果我必须进行配置,那么我最好还是将它们实例化在动物类中。我理解这一点,因为Java程序只是.class文件的松散联合,这正是它的方式。有趣的是,这似乎是相当琐碎在C#。
查看完整描述

3 回答

?
呼啦一阵风

TA贡献1802条经验 获得超6个赞

我用org.反射:

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



查看完整回答
反对 回复 2019-07-28
?
梵蒂冈之花

TA贡献1900条经验 获得超5个赞

从面向方面的角度来考虑这一点;您真正想要做的是了解所有在运行时扩展了动物类的类。(我认为这比标题更准确地描述了您的问题;否则,我认为您没有运行时问题。)

因此,我认为您想要的是创建一个基类的构造函数(动物),它将当前类的类型添加到静态数组中(我自己喜欢ArrayList,但每个类都是自己的)。

因此,大致如此;

public abstract class Animal
    {
    private static ArrayList<Class> instantiatedDerivedTypes;
    public Animal() {
        Class derivedClass = this.getClass();
        if (!instantiatedDerivedClass.contains(derivedClass)) {
            instantiatedDerivedClass.Add(derivedClass);
        }
    }

当然,要初始化实例化派生类,需要一个静态构造函数.我想这能做你想做的事。请注意,这是与执行路径相关的;如果您有一个派生自动物的Dog类,而该类从未被调用过,那么您将不会将它包含在动物类列表中。



查看完整回答
反对 回复 2019-07-28
  • 3 回答
  • 0 关注
  • 278 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信