开发者社区> 问答> 正文

关于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

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

"

展开
收起
因为相信,所以看见。 2020-05-27 12:59:19 534 0
1 条回答
写回答
取消 提交回答
  • 阿里,我所有的向往

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

    2020-05-27 16:23:48
    赞同 展开评论 打赏
问答分类:
问答标签:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
Spring Cloud Alibaba - 重新定义 Java Cloud-Native 立即下载
The Reactive Cloud Native Arch 立即下载
JAVA开发手册1.5.0 立即下载