JVM学习笔记21——类加载器实战剖析与疑难点解析

查看各类加载器的加载路径:

// 查看加载器位置
System.out.println(System.getProperty("sun.boot.class.path"));
System.out.println(System.getProperty("java.ext.dirs"));
System.out.println(System.getProperty("java.class.path"));
public class MyTest18_1 {

    public static void main(String[] args) throws Exception{
        MyTest16 loader1 = new MyTest16("loader1");
        loader1.setPath("D:\\workspace\\");
        Class<?> clazz = loader1.loadClass("com.yshuoo.jvm.classloader.MyTest1");
        System.out.println("class: " + clazz.hashCode());
        System.out.println("class loader:" + clazz.getClassLoader());
    }
}

将MyTest1放入启动类加载器能加载的路径里,最后就会有启动类加载器加载MyTest1

扩展类加载器主要是加载一些加密解密的类

public class MyTest19 {
    public static void main(String[] args) {

        AESKeyGenerator aesKeyGenerator = new AESKeyGenerator();

        System.out.println(aesKeyGenerator.getClass().getClassLoader());

        System.out.println(MyTest19.class.getClassLoader());

    }
}

修改扩展类加载器的加载路径为当前路径

java -Djava.ext.dirs=./ com.yshuoo.jvm.classloader.MyTest19

运行会发生异常,说明加载路径都是固定的

public class MyPerson {

    private MyPerson myPerson;

    public void setMyPerson(Object myPerson) {
        this.myPerson = (MyPerson)myPerson;
    }
}
MyTest16 loader1 = new MyTest16("loader1");
MyTest16 loader2 = new MyTest16("loader2");
Class<?> clazz1 = loader1.loadClass("com.yshuoo.jvm.classloader.MyPerson");
Class<?> clazz2 = loader2.loadClass("com.yshuoo.jvm.classloader.MyPerson");
System.out.println(clazz1 == clazz2);

输出为true,尽管loader1和loader2是不同的加载器实例,但是都会委托应用类加载器去加载MyPerson

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值