查找未实现hashCode的类

时间:2017-12-04 07:09:57

标签: java

我有一个包含相当一些类的项目,当我使用Debug与Intellij中的Run进行比较时,它提供了不同的答案。在两种情况下,都是正确答案,但不同。

我怀疑有一个或多个没有实现hashCode的类是造成差异的原因。我们在几个地方使用基于哈希的集合。

如何在不诉诸手动的情况下轻松找到未实现hashCode的类?

1 个答案:

答案 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;
    }

}