在运行时,查找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个赞
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()); } }}
梵蒂冈之花
TA贡献1900条经验 获得超5个赞
public abstract class Animal { private static ArrayList<Class> instantiatedDerivedTypes; public Animal() { Class derivedClass = this.getClass(); if (!instantiatedDerivedClass.contains(derivedClass)) { instantiatedDerivedClass.Add(derivedClass); } }
添加回答
举报
0/150
提交
取消