2017-03-15 44 views
0

所以我有一個problem.My assingment直到tommorw是讓Java程序,即得到一個類,然後寫入它的名稱和方法,然後得到它實現的一個,執行相同的操作並繼續到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

隨着Class#getMethods你的類的所有公共方法 - 即使它的超類提供的公共方法。

我想你想打印僅如果類還提供了實現,所以你需要檢查的聲明類的方法: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

相關問題