类加载-双亲委托机制

1.基本概念

  双亲委托机制:当某个特定的类加载器在接收到加载类的请求时,首先将该加载任务发送给父类加载器,若父类加载器仍有父类,则继续向上追溯,直到最高级。

         如果最高级父类能够加载到该类,则成功返回,否则由其子类进行加载。以此类推,如果到最后一个子类还不能成功加载,则抛出一个异常。

  作用:可以保证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