2017-07-20 55 views
2

我無法弄清楚如何獲得定義匿名內部類的原始抽象類或接口。如何從匿名類中獲取原始類? Java

例如:

public static void main(String[] args) { 
    Object obj = new Runnable() { 

     @Override 
     public void run() { 
     } 
    }; 

    System.out.println(obj.getClass()); 
    System.out.println(obj.getClass().getSuperclass()); //Works for abstract classes only 
} 

輸出:

class my.package.MyClass$1 
class java.lang.Object 

我怎樣才能獲得原班? (在這種情況下爲Runnable.class

+1

也許'obj.getInterfaces()'...但你可以包括你爲什麼想知道它。 –

回答

2

感謝您的幫助!沒有人真正回答我的問題充分了,所以我決定只發布我的解決方案:

public static Class<?> getOriginalClass(Object obj) { 
    Class<?> cls = obj.getClass(); 
    if (cls.isAnonymousClass()) { 
     return cls.getInterfaces().length == 0 ? cls.getSuperclass() : cls.getInterfaces()[0]; 
    } else { 
     return cls; 
    } 
} 

縮短:

public static Class<?> getOriginalClass(Object obj) { 
    Class<?> cls = obj.getClass(); 
    return cls.isAnonymousClass() 
      ? cls.getInterfaces().length == 0 ? cls.getSuperclass() : cls.getInterfaces()[0] 
      : cls; 
} 
1

你在做什麼是正確的獲得超類。但是,Runnable是一個接口,這就是爲什麼它不起作用。 查看關於如何獲取所有接口的答案:Get all interfaces

1

正如其他人所說的,runnable是一個接口,因此您無法使用getClass方法來獲取其名稱。然而,你可以這樣做:

System.out.println(obj.getClass().getInterfaces()[0].getName()) 

通知getInterfaces所以如果你正在實施一個以上的你不得不遍歷它與一個for循環返回數組。