2012-11-28 27 views
0

我正在寻找关于getClasses()如何工作的一些说明。我试图编写代码,给定一个String类名,找到扩展由classname指定的类的所有类。我有一个名为getChildren()的方法来做到这一点。不幸的是,每次我调用它时,该方法都会返回一个空的Collection。这是我的代码。使用java的getClasses()方法

import java.util.ArrayList; 
import java.util.Collection; 

public class ClassFinder { 

private Class<?> myClass; 

public ClassFinder(Class<?> clazz) { 
    myClass = clazz; 
} 

public ClassFinder (String className) throws ClassNotFoundException { 
    myClass = Class.forName(className); 
} 

public Collection<Class<?>> getChildren() { 
    Collection<Class<?>> children = new ArrayList<Class<?>>(); 
    Class<?>[] relatedClasses = myClass.getClasses(); 
    for (Class<?> potentialChild : relatedClasses) { 
     if (potentialChild.isAssignableFrom(myClass)) { 
      children.add(potentialChild); 
     } 
    } 
    return children; 
} 


} 
+0

如果您正在尝试编写某种插件框架,请查看[java.util.ServiceLoader](http://docs.oracle.com/javase/6/docs/api/java/util/ServiceLoader。 HTML)为更好的方式来处理这个问题。 – jtahlborn

回答

0

如果你读了getClasses()文档...

返回包含代表所有的公共类和接口的成员类对象的数组由此Class对象表示的类的类。

关键词:“是成员” - 不是扩展这个类的类。这种方法会给你inner classes,而不是child classes

运行这个例子:

public class Example { 

    public static void main(String[] argv) { 
     for(Class c:Example.class.getClasses()) { 
      System.out.println(c.getName()); 
     } 
    } 

    public class InnerClass { 

    } 

} 

,你会得到这样的输出:

Example$InnerClass 
0

你可以做的是创造自己的ClassLoader并用它来加载类,在该类加载器可以保留您加载的所有类的列表

然后,无论您何时需要查找给定类的扩展类数,都可以遍历列表中的所有类,并使用类getSuperclass()的此方法来确定此方法返回的值是否与类相同你正在试图找到孩子。

但是这个代码有一个限制,它可能不会返回所期望的所有类。这是因为在执行代码时,扩展给定类的所有类都可能未加载。