首页  >  问答  >  正文

关于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 天前384

全部回复(1)我来回复

  • 天蓬老师

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

    你确定是两段相同的代码吗?
    第一个代码段里面有多一句
    return (T) myClassLoader.loadClass(className).newInstance();

    回复
    0
  • 取消回复