我是靠谱客的博主 无聊流沙,最近开发中收集的这篇文章主要介绍类加载器不同的类相同,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

今天看《深入理解Java虚拟机》的7.4.1节时,实现一个书本上的代码,与书本结果不一致,不知道是因为JDK版本问题(本人JDK1.8)还是其他原因。

先给出代码:

package com.bjtu.ClassLoader;
import java.io.IOException;
import java.io.InputStream;

/**
 * created by LMR on 2019/5/30
 */
public class ClassLoaderTest {

    public static void main(String[] args) throws Exception{

        ClassLoader myLoader = new ClassLoader() {

            @Override
            public Class<?> loadClass(String name) throws ClassNotFoundException {

                try {
                    String fileName = name.substring(name.lastIndexOf(".") + 1) + "class";
                    InputStream resourceAsStream = getClass().getResourceAsStream(fileName);

                    if (resourceAsStream == null)
                        return super.loadClass(name);

                    byte[] b = new byte[resourceAsStream.available()];
                    resourceAsStream.read(b);
                    return defineClass(name, b, 0, b.length);
                }catch (IOException e)
                {
                    throw new ClassNotFoundException();
                }
            }
        };

        Object obj = myLoader.loadClass("com.bjtu.ClassLoader.ClassLoaderTest").newInstance();
        System.out.println(obj.getClass());

        System.out.println(obj instanceof com.bjtu.ClassLoader.ClassLoaderTest);
    }
}

书本上的结果是:

class com.bjtu.ClassLoader.ClassLoaderTest
false

第二句输出false,其原因是虚拟机中存在了两个ClassLoaderTest类,一个是由系统程序类加载器加载的,一个是由我们自己定义的类加载器加载的,所以属于两个独立的类。也就是说类的唯一性由类加载器和类本身决定。但是在本机上的实际结果确返回的是true。

最后

以上就是无聊流沙为你收集整理的类加载器不同的类相同的全部内容,希望文章能够帮你解决类加载器不同的类相同所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(89)

评论列表共有 0 条评论

立即
投稿
返回
顶部