现在的位置: 首页 > 综合 > 正文

类加载器

2018年06月08日 ⁄ 综合 ⁄ 共 1206字 ⁄ 字号 评论关闭

转载请注明出处:http://blog.csdn.net/kai_wei_zhang/article/details/8234690


类加载器

1、Bootsrap ClassLoader 是Sun JDK采用C++实现的类,此类并非ClassLoader的子类,在代码中无法得到类对象,Sun JDK启动时会初始化此ClassLoader,并有ClassLoader完成$JAVA_HOME中jre/lib/rt.jar里面所有class文件的加载,jar中包含了Java规范中定义的所有接口及实现

2、自己实现一个类,在类中打印出下载器A和A的父类B、B的父类C,则A为AppClassLoader、B为ExtClassLoader、C为null

这是由于Bootstrap ClassLoader并不是Java中的ClassLoader。故Extension ClassLoader的parent为null

3、双亲委派模型的工作过程是:如果一个类加载器收到了类加载请求,它首先不会自己尝试加载这个类,而是把这个请求委派给父类加载器去完成,每一个层次的类加载器都是如此,因此所有的加载请求最终都应该传送到顶层的启动类加载器中,只有当父加载器反馈自己无法完成这个加载请求(在它的搜索范围中没有找到)时,子加载器才会尝试自己去加载

好处:这种机制保证了同一个ClassLoader实例对象中只能加载一次同样名称的class如java.lang.Object在rt.jar中,无论哪个类加载器都是委派给启动类加载器去加载,故Object类在程序中的各种类加载器环境中是同一个类

4、ClassLoader抽象类定义了几个关键方法:

loadClass()负责加载指定名字的类

defineClass()负责将二进制的字节码转换为class对象

resolveClass()负责完成class对象的链接

当开发人员调用Class.forName来获取一个对应名称的对象时,JVM会从方法栈上寻找第一个ClassLoader,通常就是执行Class.forName所在类的ClassLoader

5、类加载器常见的异常

ClassNotFoundException:在当前的ClassLoader中加载类时未找到类文件

NoClassDefFoundError:加载的类中引用到的另外的类不存在

LinkageError:此类已经在ClassLoader加载过了,重复的加载会造成该异常(并发情况下),由于JVM这个保护机制,使得JVM中没办法直接更新一个已经load的class,只能创建一个新ClassLoader来加载更新class,然后将新的请求转入该ClassLoader来获取类,这也是JVM中不好实现动态更新的原因之一,而其他的原因是对象的状态的复制、依赖的设置等

ClassCastException:该异常有多种原因,合理使用泛型可以减少发生

【上篇】
【下篇】

抱歉!评论已关闭.