首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

黑马软件工程师-类加载器学习注意点

2012-09-07 
黑马程序员------类加载器学习注意点---------------------- android培训、java培训、期待与您交流! -------

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

---------------------- 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

?

热点排行