黑马程序员------类加载器学习注意点
---------------------- 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
?