ClassLoader 深入解析学习笔记(三)

我们知道ClassLoader加载机制是双亲委托模型,第一个原先是为了避免重复加载,在学习笔记一中也得到体现,至于第二点是为了安全,避免我们动态修改java核心的api。那我们就开始证明这结论吧。
我们自定义String类,代码如下

//注意报名定义必须与java核心String类一样
package java.lang;


import org.junit.Test;

public class String {
    private int value;
    public String (){//方便测试
        this.value=0;
        System.out.println("调用自定义String构造方法,初始化成员变量值"+value);
    }
    public String (int value){
        this.value=value;
    }

    public int getValue() {
        return value;
    }
    public void setValue(int value) {
        this.value = value;
    }

}

测试代码如下:

package test;
import org.junit.Test;
import java.lang.String;
public class ClassLoaderTestString {

    @Test
    public void test(){
        String str=new String();
        ClassLoader cl=str.getClass().getClassLoader();
        System.out.println("String的加载器是:"+ cl);
    }


}

可能有人会有疑问,测试代码中的String是我们自定义的String吗?附上证据,当我们把代码改为
String str=new String (“测试”);代码会编译不通过,
这里写图片描述

提示我们将String 类中的 String(int) 构造方法改为 String(String);
还有就是通过ctrl键访问String类时,访问到的是我们定义的String,而不是java核心类库中String。那测试结果会不会输出
“调用自定义String构造方法,初始化成员变量值0”
“String的加载器是 AppClassLoader” 呢
答案是否定的:程序并没有调用我们自己定义String类的构造方法,加载器也不是App。而是根加载器BootStrap
测试结果:
这里写图片描述
可能还有同学会怀疑,测试代码中的String,不是我们定义的String,我们再将测试代码再加一行,核心String是没有getValue方法的,可以看出编译通过。

        System.out.println("自定义String的值为:"+str.getValue());

我们再看执行结果:
这里写图片描述
我们可以很清楚的看到报错原因是说java.lang.String 类中没有getValue()方法。所以双亲委托方法会避免我们修改java核心api。加载原理就是,在加载java.lang.String类时,App加载器先委托给BootStrap器,你看看你那里有没有java.lang.String类,BootStrap一看有,那就从BootStrap这里拿。需要注意都是String的包名路径必须与核心String一致,不然,在Boot与Ext加载器中都没有String类,当然加载的也就是我们自定义的类。
我们main包下创建了个String类如下

package main;

import org.junit.Test;

public class String {
    private int value;
    public String (){
        this.value=0;
        System.out.println("调用自定义String构造方法,初始化成员变量值"+value);

    }
    public String (int value){
        this.value=value;
    }

    public int getValue() {
        return value;
    }
    public void setValue(int value) {
        this.value = value;
    }

}

执行结果
这里写图片描述

猜你喜欢

转载自blog.csdn.net/whandgdh/article/details/80315402