【问题标题】:How to compare 2 classes which are loaded from 2 different classloader如何比较从 2 个不同的类加载器加载的 2 个类
【发布时间】:2010-10-22 14:59:38
【问题描述】:

这是我的情况: 类加载器A,加载一个类(“Class1”); 然后,我更改了 Class1.java 并编译它。 接下来我通过类加载器 B 再次加载 Class1.class。 我想比较这两个类,检查类元数据是否被某人更改。 有没有办法比较两个类的定义数据?

【问题讨论】:

    标签: java class compare classloader


    【解决方案1】:

    除了您可以通过反射 API 找到的内容之外,我不完全确定您所说的“类元数据”是什么意思。这是根据我的最佳猜测来回答这个问题的尝试。

    定义数据是指它们声明的内部变量和方法签名吗?因为您可以通过反射(getDeclaredMethod() 和 getDeclaredFields())来做到这一点。但是,如果这两个类是从不同的类加载器加载的,那么它们将不相等(请参阅 Class javadocs 关于相等性),即使它们是从相同的编译字节码加载的。

    您可以从反射 API 获得其他信息,包括它继承自什么类、它实现什么接口以及使用它编译的任何注解(当然假设是 1.5 或更高版本)。

    您还可以对 Class 文件进行哈希处理(可以通过类加载器找到它们)并查看它们是否不同 - 这会告诉您它们是否有不同的代码。

    希望对您有所帮助。

    【讨论】:

      【解决方案2】:

      谢谢! 反射可以收集一个类的元数据,但是很难检查一个类是否改变了。

      我可以找到那个类文件,但也很难检查一个类是否改变了。

      我认为应该有一种方法可以检查加载的类,它们是否具有相同的数据(来自同一个 java 文件)。

      【讨论】:

        猜你喜欢
        • 2023-03-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-11-01
        相关资源
        最近更新 更多