2015-02-10 109 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

相关问题