双亲委托机制:当某个特定的类加载器在接收到加载类的请求时,首先将该加载任务发送给父类加载器,若父类加载器仍有父类,则继续向上追溯,直到最高级。
如果最高级父类能够加载到该类,则成功返回,否则由其子类进行加载。以此类推,如果到最后一个子类还不能成功加载,则抛出一个异常。
作用:可以保证java核心库或第三方库的安全(防止低一级加载器加载的类覆盖高级加载器加载的类)
2.例子: 假设我们自定义个String类,然后使用自定义类加载器进行加载,由于双亲委托机制,我们并不能成功加载我们自己定义的类,而是加载了java.lang.String类
第一步:在项目下新建一个包 包名叫做 java.lang
第二步:在这个包下新建一个类叫做 String
这时我们就创建出来一个假的java.lang.String 类,那么这个时候如果我们再使用String类时,按照正常流程应该由应用类加载器进行加载。但是由于双亲委派机制,
String类应该是由启动类加载器(引导类加载器)加载。 好下面我们进行第三步
第三步:在这个项目中再随便建一个包然后建一个测试类,在测试类中的main方法中new一个String字符串 并且输出,同时输出一下这个类的加载器
测试类中的代码:
1 public class MyTest { 2 3 public static void main(String[] args) { 4 // TODO Auto-generated method stub 5 String s = "xiaobai"; 6 System.out.println(s.getClass().getClassLoader()); //null 7 System.out.println(s); //xiaobai 8 } 9 10 }
我们看到,获得的类加载器的结果为null 并且字符串可以正常输出。说明使用了双亲委托机制调用了启动类加载器进行加载String类,而不是加载我们这个假的String类。
注:由于启动类加载器的实现方式并不是继承ClassLoader,而是使用c++实现,所以获得类加载器时会返回null
原文:https://www.cnblogs.com/xiaobai1202/p/10840673.html