Два экземпляра пользовательского загрузчика классов загружают один и тот же класс, но класс не равен - PullRequest
0 голосов
/ 22 октября 2018

я использовал два экземпляра пользовательского загрузчика классов для загрузки класса, но их хеш-код не равен.

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 () проверить, есть ли в кеше класс загрузчика. DemoObj.Код выше должен возвращать два одинаковых числа ,, но мой код возвращает другое.

1846274136
1639705018
...