【发布时间】:2015-02-10 17:25:22
【问题描述】:
我有一堆代理对象,我需要确定这些对象除了代理之外是哪些类和接口的实例。 换句话说,我实际上并不是在寻找 instanceof 运算符,而是在寻找所有类和接口,其中 instanceof 将为特定对象返回 true。
【问题讨论】:
-
您能分享您对这个文档丰富的功能的研究吗?这样我们就知道您已经掌握了该主题的哪些知识。
标签: java reflection
我有一堆代理对象,我需要确定这些对象除了代理之外是哪些类和接口的实例。 换句话说,我实际上并不是在寻找 instanceof 运算符,而是在寻找所有类和接口,其中 instanceof 将为特定对象返回 true。
【问题讨论】:
标签: java reflection
您可以使用反射来确定这一点。从根本上说,Java Class 类包含列出接口和超类的访问器。
Class clazz = someObject.getClass();
clazz.getInterfaces();
clazz.getSuperclass();
您应该进一步了解 Java 反射 API。一个好的地方可能是从the Class documentation 开始。
【讨论】:
您应该使用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;
}
【讨论】:
getSuperclasses 不处理基本情况,getSuperInterfaces 不递归。
使用反射 API,您可以实现您想要的。您必须扫描要搜索类的包、实现或扩展特定接口/类。
【讨论】: