我有一个包含相当一些类的项目,当我使用Debug
与Intellij中的Run
进行比较时,它提供了不同的答案。在两种情况下,都是正确答案,但不同。
我怀疑有一个或多个没有实现hashCode
的类是造成差异的原因。我们在几个地方使用基于哈希的集合。
如何在不诉诸手动的情况下轻松找到未实现hashCode
的类?
答案 0 :(得分:1)
您可以尝试使用自定义类加载器运行它,而不会覆盖hashCode的打印类。使用-Djava.system.class.loader=my.package.HashFindingLoader
package my.package;
import java.lang.reflect.Method;
public class HashFindingLoader extends ClassLoader {
public HashFindingLoader(ClassLoader parent) {
super(parent);
}
@Override
public Class<?> loadClass(String name) throws ClassNotFoundException {
Class<?> c = super.loadClass(name);
//filters out librry classes, adjust as necessary
if(!c.getPackage().getName().matches("^(java|sun).*")){
Method hashCode;
try {
hashCode = c.getMethod("hashCode");
} catch (NoSuchMethodException|SecurityException ex) {
throw new RuntimeException(ex);
}
if (hashCode.getDeclaringClass().equals(Object.class)){
System.out.printf("%s does not override hashCode%n", c);
}
}
return c;
}
}