黑马程序员------类加载器学习注意点

---------------------- android培训java培训、期待与您交流! ----------------------
在学习类加载器时学习到了jvm加载类的机制,现做下记录:
  首先java加载器使用委托机制进行类的加载,每个类加载器在加载类时,会先委托给上级类加载器(一直到祖宗类加载器)。
 比如AppClassLoader->ExtClassLoader->BootStrap。这里BootStrap就是祖宗类加载器,有人说他是祖宗类,那谁来加载它。实际
 上BootStrap不是java编写的,而是由C++编写,由于它不是java类所以不需要被加载。我们经常用的System类就是BootStrap加载的,
 这样为了防止大家覆写system类。委托机制就是一个类加载器加载类时委托到BootStrap再开始一级级往下寻找加载。过程中如果加
 载到相应类就返回它,不然直到原加载器都没有加载到时就报ClassNotFoundException异常。
  AppClassLoader加载器的话是根据classpath所指定的路径来找jar包来加载类。ExtClassLoader是找到jdk中的ext文件夹下的
 jar包来加载类(也就是所谓的扩展包)。
 附件为加载器委托机制图

package HEIMA_annotation;

import java.util.Date;



public class ClassLoaderTest { 
    
   /* 有一道面试题,能不能自己写一个java.lang.System类?一般不可以,为了不让我们写System类,类加载采用委托机制,
    * 让Bootstrap loader(由C++写的,不是一个java类,不需要被加载) 直接加载System类,我们可以自己买一个加载器并抛弃委托机制*/
    public static void main(String args[]) throws ClassNotFoundException, InstantiationException, IllegalAccessException{
        System.out.println(
                ClassLoaderTest.class.getClassLoader().getClass().getName()
        );
        System.out.println(
                System.class.getClassLoader()
        );
        
        ClassLoader loader = ClassLoaderTest.class.getClassLoader();
        while(loader != null){ 
            System.out.println(loader.getClass().getName());
            loader = loader.getParent();
        }
        System.out.println(loader);
       /* 委托机制:每个类加载器加载类时,又先委托给其上级类加载器。当所有祖宗类加载器没有加载到类,回到发起者类加载器,还加载不了,则
        抛ClassNotFoundException,不是在去找发起者类加载器的子类加载器。*/
        
//        System.out.println(new ClassLoaderAttachment().toString());//ClassLoaderAttachment.class已被加密,会报错
        Class clazz = new MyClassLoader("itcastlib").loadClass("Annotation.ClassLoaderAttachment");//使用自己的加载类加载测试类(需将原本工作区间的正常class文件替换为经过加密的class文件)
//        ClassLoaderAttachment d1 = (ClassLoaderAttachment)clazz.newInstance();//报异常,因为jvm不能识别ClassLoaderAttachment这个类,它是一个被加密的类,应使用它的父类类型,如下
        Date d1 = (Date)clazz.newInstance();
        System.out.println(d1);
    }
}

 
---------------------- android培训java培训、期待与您交流! ----------------------
详细请查看:http://edu.csdn.net/heima

 

你可能感兴趣的:(类加载器)