【发布时间】:2010-10-22 14:59:38
【问题描述】:
这是我的情况: 类加载器A,加载一个类(“Class1”); 然后,我更改了 Class1.java 并编译它。 接下来我通过类加载器 B 再次加载 Class1.class。 我想比较这两个类,检查类元数据是否被某人更改。 有没有办法比较两个类的定义数据?
【问题讨论】:
标签: java class compare classloader
这是我的情况: 类加载器A,加载一个类(“Class1”); 然后,我更改了 Class1.java 并编译它。 接下来我通过类加载器 B 再次加载 Class1.class。 我想比较这两个类,检查类元数据是否被某人更改。 有没有办法比较两个类的定义数据?
【问题讨论】:
标签: java class compare classloader
除了您可以通过反射 API 找到的内容之外,我不完全确定您所说的“类元数据”是什么意思。这是根据我的最佳猜测来回答这个问题的尝试。
定义数据是指它们声明的内部变量和方法签名吗?因为您可以通过反射(getDeclaredMethod() 和 getDeclaredFields())来做到这一点。但是,如果这两个类是从不同的类加载器加载的,那么它们将不相等(请参阅 Class javadocs 关于相等性),即使它们是从相同的编译字节码加载的。
您可以从反射 API 获得其他信息,包括它继承自什么类、它实现什么接口以及使用它编译的任何注解(当然假设是 1.5 或更高版本)。
您还可以对 Class 文件进行哈希处理(可以通过类加载器找到它们)并查看它们是否不同 - 这会告诉您它们是否有不同的代码。
希望对您有所帮助。
【讨论】:
谢谢! 反射可以收集一个类的元数据,但是很难检查一个类是否改变了。
我可以找到那个类文件,但也很难检查一个类是否改变了。
我认为应该有一种方法可以检查加载的类,它们是否具有相同的数据(来自同一个 java 文件)。
【讨论】: