【问题标题】:How to get all the interfaces and classes that an object is an instance of?如何获取对象作为实例的所有接口和类?
【发布时间】:2015-02-10 17:25:22
【问题描述】:

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

【问题讨论】:

  • 您能分享您对这个文档丰富的功能的研究吗?这样我们就知道您已经掌握了该主题的哪些知识。

标签: java reflection


【解决方案1】:

您可以使用反射来确定这一点。从根本上说,Java Class 类包含列出接口和超类的访问器。

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

您应该进一步了解 Java 反射 API。一个好的地方可能是从the Class documentation 开始。

【讨论】:

    【解决方案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;
    }
    

    【讨论】:

    • getSuperclasses 不处理基本情况,getSuperInterfaces 不递归。
    【解决方案3】:

    使用反射 API,您可以实现您想要的。您必须扫描要搜索类的包、实现或扩展特定接口/类。

    【讨论】:

    • 包扫描是为了反向操作,这不是OP的问题。包扫描也是一种相当可疑的技术,因为您并不总是知道包的所有潜在来源,最常见的是 jar 文件、类文件、Internet 连接和字节码生成器。
    猜你喜欢
    • 2017-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-07
    • 1970-01-01
    • 2010-09-06
    相关资源
    最近更新 更多