关于JAVA类加载器。
高洛峰
高洛峰 2017-04-18 10:48:13
[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

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

高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

全部回复(1)
天蓬老师

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

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号