ホームページ  >  に質問  >  本文

关于JAVA类加载器。

public static <T> T classLoader(String className) throws Exception {
        ClassLoader myClassLoader = new ClassLoader() {
            @Override
            protected Class<?> findClass(String name) throws ClassNotFoundException {
                try {
                    //获取类文件名
                    String fileName = name.substring(name.lastIndexOf(".") + 1) + ".class";
                    InputStream inputStream = getClass().getResourceAsStream(fileName);
                    if (inputStream == null) {
                        return super.findClass(fileName);
                    }
                    byte[] bytes = new byte[inputStream.available()];
                    inputStream.close();
                    return defineClass(name, bytes, 0, bytes.length);
                } catch (IOException e) {
                    throw new ClassNotFoundException();
                }
            }
        };
        return (T) myClassLoader.loadClass(className).newInstance();
    }
public static void main(String[] args) throws Exception {
        //测试1
        Object obj2 = classLoader("com.myweb.reflect.classloader.ClassLoaderTest");
        System.out.println(obj2.getClass());
        System.out.println(obj2 instanceof com.myweb.reflect.classloader.ClassLoaderTest);
        
        //测试2
        ClassLoader myClassLoader = new ClassLoader() {
            @Override
            protected Class<?> findClass(String name) throws ClassNotFoundException {
                try {
                    //获取类文件名
                    String fileName = name.substring(name.lastIndexOf(".") + 1) + ".class";
                    InputStream inputStream = getClass().getResourceAsStream(fileName);
                    if (inputStream == null) {
                        return super.findClass(fileName);
                    }
                    byte[] bytes = new byte[inputStream.available()];
                    inputStream.close();
                    return defineClass(name, bytes, 0, bytes.length);
                } catch (IOException e) {
                    throw new ClassNotFoundException();
                }
            }
        };

        Object obj3 = myClassLoader.loadClass("com.myweb.reflect.classloader.ClassLoaderTest");
        System.out.println(obj3.getClass());
        System.out.println(obj3 instanceof com.myweb.reflect.classloader.ClassLoaderTest);
}

输出:
class com.myweb.reflect.classloader.ClassLoaderTest
true
class java.lang.Class
false

为什么两段相同的代码,只是一个单独提取出来,输出就不一样了呢?

高洛峰高洛峰2744日前373

全員に返信(1)返信します

  • 天蓬老师

    天蓬老师2017-04-18 10:50:13

    これらは 2 つの同一のコードであると確信していますか?
    最初のコードスニペットにはもう 1 つの文があります
    return (T) myClassLoader.loadClass(className).newInstance();

    返事
    0
  • キャンセル返事