2017-03-15 1 views
0

그래서 문제가 있습니다. tommorw가 될 때까지 내 생각은 클래스를 가져 오는 Java 프로그램을 만드는 것입니다. 그것의 이름과 메소드, 그럼 구현하는 것을 얻고, 똑같이하고 Object까지 계속된다. 문제는 내가 그것을 만들어서 메소드가 스스로를 반복하지 않도록해야한다는 것이다. (메소드를 추가하는 클래스 만이 그것을 출력해야한다. 그 클래스의 구현은 더 이상 가지고 있지 않아야합니다.) 모든 것을 한 번만 출력하므로 매우 이상하게 인쇄합니다. 여기 코드는 다음과 같습니다 Class#getMethods특정 클래스에서 트리 위로 Object 및 메소드 가져 오기 (두 번 이상 쓰지 않고)

public static void main(String[] args) { 
    Object o = new JRadioButton(); 
    Class cl; 
    HashSet methodsnames = new HashSet(); 

    for (cl = o.getClass(); cl != null; cl = cl.getSuperclass()) { 
     HashSet al = new HashSet(); 
     System.out.println(cl.getName()+ " - "); 
     for (Method m : cl.getMethods()){ 
      boolean added = methodsnames.add(m.getName()); 
      if(added){ 
      al.add(m.getName());} 
     } 
     al.forEach(System.out::println); 

     System.out.println("============================="); 
    } 
} 
+1

출력에 어떤 문제가 있습니까? –

+0

출력물의 모양과 모양은 어떻게됩니까? –

+0

거기에 루프를 추가 할 필요가 없습니다 – efekctive

답변

2

당신은 클래스의 모든 public 메소드 얻을 - 그것의 슈퍼 클래스가 제공 심지어 공공 방법을. m.getDeclaringClass().equals(cl)

0

사용 getDeclaredMethods 대신 getMethods :

import java.lang.*; 
import java.lang.reflect.*; 
import java.util.*; 
import javax.swing.*; 

public class main 
{ 
    public static void main(String ...args) { 
     Object o = new JRadioButton(); 
     Class cl; 
     HashSet methodsnames = new HashSet(); 

     for (cl = o.getClass(); cl != null; cl = cl.getSuperclass()) { 
      HashSet al = new HashSet(); 
      System.out.println(cl.getName()+ " - "); 
      for (Method m : cl.getDeclaredMethods()){ 
       boolean added = methodsnames.add(m.getName()); 
       if(added){ 
       al.add(m.getName());} 
      } 
      al.forEach(System.out::println); 

      System.out.println("============================="); 
     } 
    } 
} 

확인이 코드들이받은

나는 당신이 선언 클래스를 확인해야하므로 클래스는 또한 구현을 제공하는 경우에만이 방법을 인쇄 할 생각 Ideone에 있습니다.

관련 문제