自定义类加载器的两个实例加载相同的类,但类不相等

时间:2018-10-22 15:39:29

标签: java classloader

我使用了自定义类加载器的两个实例来加载类,但是它们的hashCode不相等。

public class MyClassLoader extends ClassLoader{

    private String mLibPath;

    public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException {
        MyClassLoader classLoader1 = new MyClassLoader("/Users/kk/Downloads");
        MyClassLoader classLoader2 = new MyClassLoader("/Users/kk/Downloads");
        Class<?> c1 = classLoader1.loadClass("loader.DemoObj");
        Class<?> c2 = classLoader2.loadClass("loader.DemoObj");
        System.out.println(c1.hashCode());
        System.out.println(c2.hashCode());

    }

    public MyClassLoader(String path){
        mLibPath = path;
    }

    @Override
    protected Class<?> findClass(String name) throws ClassNotFoundException {
        String fileName = getFileName(name);
        File file = new File(mLibPath,fileName);
        try {
            FileInputStream is = new FileInputStream(file);

            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            int len=0;
            try{
                while((len = is.read()) != -1){
                    bos.write(len);
                }
            }catch (IOException e){
                e.printStackTrace();
            }
            byte[] data = bos.toByteArray();
            is.close();
            bos.close();

            return defineClass(name, data, 0, data.length);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return super.findClass(name);



    }

    private String getFileName(String name){
        name = name.replace(".","/");
        return name+".class";
    }


}

classLoader1和classLoader2都调用loadClass(“ loader.DemoObj”),它们应该调用findLoadedClass()来检查缓存是否具有loader.DemoObj的类。上面的代码应该返回两个相同的数字,但我的代码返回不同的数字。

1846274136
1639705018

0 个答案:

没有答案