双亲委托机制

当前类applicationclassloader加载类的时候,首先查看这个类是否被加载过,被加载过直接返回,没有加载过会委托父类尝试加载,父类没有加载过会继续委托其父类,一直到bootstrapclassloader。

这样做的好处就是避免用户自己恶意写了一些与基础类相同名字类所造成的错误。

从上面可以看出loadClass方法调用了loadcClass(name,false)方法,那么接下来我们再来看看另外一个loadClass方法的实现。

Class loadClass(String name, boolean resolve)

 

protected synchronized Class<?> loadClass(String name, boolean resolve) 

 throws ClassNotFoundException   

 {  // First, check if the class has already been loaded  Class c = findLoadedClass(name);

//检查class是否已经被加载过了  if (c == null)

 {     

 try {      

if (parent != null) {         

 c = parent.loadClass(name, false); //如果没有被加载,且指定了父类加载器,则委托父加载器加载。    

  } else {        

  c = findBootstrapClass0(name);//如果没有父类加载器,则委托bootstrap加载器加载      } 

     } catch (ClassNotFoundException e) {         

 // If still not found, then invoke findClass in order          

// to find the class.         

 c = findClass(name);//如果父类加载没有加载到,则通过自己的findClass来加载。      } 

 } 

 if (resolve) 

{     

 resolveClass(c); 

 }  

return c;

}

类加载的主要步骤

装载: 把class文件装载到内存中

链接 检验class文件的准确性,分配静态变量的空间

初始化:静态变量赋予初始值,静态代码块初始化

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值