JVM学习笔记20——类加载器命名空间实战剖析与透彻理解

在上一节的基础上创建MyTest17_1

public class MyTest17_1 {

    public static void main(String[] args) throws Exception{
        // 将系统类加载器当做loader1的父加载器
        MyTest16 loader1 = new MyTest16("loader1");

        loader1.setPath("D:\\workspace\\");

        Class<?> clazz = loader1.loadClass("com.yshuoo.jvm.classloader.MySample");
        System.out.println("class: " + clazz.hashCode());
        
        Object object = clazz.newInstance();

    }

}

只删除target里的MyCat,运行程序报错

只删除target里的MySample,运行正常

是由加载了MySample的类加载器去加载的MyCat

对MyCat做出如下改变

public class MyCat {

    public MyCat(){

        System.out.println("MyCat is loaded by: " + this.getClass().getClassLoader());

        System.out.println("from MyCat: " + MySample.class);
    }

}

删除target里的MySample,运行报错

对MySample进行改造,将MyCat的改变复原

public MySample(){
        System.out.println("MySample is loaded by: " + this.getClass().getClassLoader());

        new MyCat();

        System.out.println("from MySample: " + MyCat.class);
    }

public class MyCat {

    public MyCat(){

        System.out.println("MyCat is loaded by: " + this.getClass().getClassLoader());

    }

}

重新编译后再次把MySample删掉,运行正常

关于命名空间的重要说明:

  • 子加载器所加载的类能够访问到父加载器所加载的类
  • 父加载器所加载的类无法访问到子加载器所加载的类
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值