2012-11-28 8 views
0

getClasses()가 어떻게 작동하는지에 대한 명확한 설명을 찾고 있습니다. String classname을 지정하면 classname에 지정된 클래스를 확장하는 모든 클래스를 찾는 코드를 작성하려고합니다. 이 작업을 수행하는 getChildren() 메서드가 있습니다. 불행히도, 내가 그것을 호출 할 때마다 메소드는 빈 Collection을 리턴한다. 여기 내 코드가있다.자바의 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

답변

5

getClasses은 현재 클래스로 묶인 클래스를 반환합니다. 현재 클래스에서 상속받은 클래스를 찾고 싶습니다. 불행히도이를 수행 할 수있는 Java API에는 메소드가 없습니다. 당신은 그러나로드 된 클래스를 통해 볼 수

: How can I list all classes loaded in a specific class loader

+0

가장 빠른 총에 +1! –

0

당신이 getClasses()에 대한 설명서를 읽어 보면 ...

는 구성원 인 모든 public 클래스와 인터페이스를 나타내는 Class 객체를 포함하고있는 배열을 돌려줍니다 이 Class 객체가 나타내는 클래스의

키워드 : "해당 회원입니다"-이 클래스를 확장하는 클래스가 아닙니다. 이 방법은 child classes가 아닌 inner 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

당신이 할 수있는 것은에서, 자신의 클래스 로더을 생성하고 클래스를로드하는 것을 사용입니다 해당 클래스 로더를 사용하면로드 한 모든 클래스 중 목록을 유지할 수 있습니다.

주어진 클래스를 확장하는 클래스의 수를 알아야 할 때마다 목록의 모든 클래스를 살펴보고이 메서드가 사용하는 클래스 getSuperclass()을 사용하여이 메서드에서 반환 된 값이 클래스와 같은지 확인합니다 당신은의 아이들을 찾으려고 노력하고 있습니다.

은 그러나 당신이 기대하는 모든 클래스를 반환하지 않을 수 있습니다이 코드의 제한이있다. 이는 코드를 실행할 때 주어진 클래스를 확장하는 모든 클래스가로드되지 않았기 때문입니다.