如何获取对象所属的所有接口和类?

时间:2015-02-10 17:25:22

标签: java reflection

我有一堆代理对象,我需要确定这些对象除了Proxy之外还有哪些类和接口。 换句话说,我实际上并不是在寻找instanceof运算符,而是希望获得instanceof为特定对象返回true的所有类和接口。

3 个答案:

答案 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,您可以实现您想要的效果。您必须扫描要搜索实现的包或扩展特定接口/类的包。