我有一堆代理对象,我需要确定这些对象除了Proxy之外还有哪些类和接口。 换句话说,我实际上并不是在寻找instanceof运算符,而是希望获得instanceof为特定对象返回true的所有类和接口。
答案 0 :(得分:5)
您可以使用反射来确定这一点。从根本上说,Java Class
类包含列出接口和超类的访问器。
Class clazz = someObject.getClass();
clazz.getInterfaces();
clazz.getSuperclass();
您应该进一步了解Java Reflection API。一个好地方可能是从the Class documentation开始。
答案 1 :(得分: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;
}
答案 2 :(得分:0)
使用Reflection API,您可以实现您想要的效果。您必须扫描要搜索实现的包或扩展特定接口/类的包。