2015-02-10 71 views
-1

我有一堆代理對象,我需要確定哪些類和接口這些對象除了代理的實例。 換句話說,我實際上並不是在尋找instanceof運算符,而是希望獲得所有的類和接口,以便instanceof將爲特定對象返回true。如何獲取對象是實例的所有接口和類?

+4

你可以分享你研究這個嚴重文件功能?這樣我們就知道你已經掌握了哪些知識。 – 2015-02-10 17:26:50

回答

5

您可以使用反射來確定這一點。基本上,Java Class類包含列出接口和超類的訪問器。

Class clazz = someObject.getClass(); 
clazz.getInterfaces(); 
clazz.getSuperclass(); 

您應該進一步閱讀Java Reflection API。一個好地方可能是從the Class documentation開始。

0

有了Reflection API,你可以實現你想要的。你將不得不掃描你想要搜索的包,或者擴展一個特定的接口/類。

2

您應該使用Class.getInterfaces()Class.getSuperclass()方法。我相信這些將需要遞歸;一個例子是:

<T> Set<Class<? super T>> getSuperclasses(Class<? super T> clazz) { 
    Set<Class<? super T>> superclasses = new HashSet<>(); 
    if (clazz.getSuperclass() != null) { 
     superclasses.addAll(getSuperclasses(clazz.getSuperclass())); 
    } 
    return superclasses; 
} 

和接口:

<T> Set<Class<? super T>> getSuperInterfaces(Class<T> clazz) { 
    Set<Class<? super T>> superInterfaces = new HashSet<>(); 
    if (clazz.getInterfaces().length != 0) { 
     // Only keep the one you use 
     // Java 7: 
     for (Class<?> superInterface : clazz.getInterfaces()) { 
      // noinspection unchecked 
      superInterfaces.add((Class<? super T>) superInterface); 
     } 
     // Java 8: 
     // noinspection unchecked 
     Arrays.stream(clazz.getInterfaces()).map(c -> (Class<? super T>) c).forEach(superInterfaces::add); 
    } 
    return superInterfaces; 
} 
+0

'getSuperclasses'不處理基本情況,'getSuperInterfaces'不處理。 – 2016-08-10 22:33:43

相關問題