读书人

classloader 3

发布时间: 2012-10-20 14:12:47 作者: rapoo

classloader 三

jvm classLoader architecture :

a, Bootstrap ClassLoader/启动类加载器
主要负责jdk_home/lib目录下的核心 api 或 -Xbootclasspath 选项指定的jar包装入工作.

?

b, Extension ClassLoader/扩展类加载器
主要负责jdk_home/lib/ext目录下的jar包或 -Djava.ext.dirs 指定目录下的jar包装入工作

?

c, System ClassLoader/系统类加载器
主要负责java -classpath/-Djava.class.path所指的目录下的类与jar包装入工作.

?

b, User Custom ClassLoader/用户自定义类加载器(java.lang.ClassLoader的子类)
在程序运行期间, 通过java.lang.ClassLoader的子类动态加载class文件, 体现java动态实时类装入特性.

?

类加载器的特性:

1, 每个ClassLoader都维护了一份自己的名称空间, 同一个名称空间里不能出现两个同名的类。
2, 为了实现java安全沙箱模型顶层的类加载器安全机制, java默认采用了 ” 双亲委派的加载链 ” 结构.


如下图:
classloader 3

Class Diagram:
classloader 3

类图中, BootstrapClassLoader是一个单独的java类, 其实在这里, 不应该叫他是一个java类。
因为, 它已经完全不用java实现了。

?

它是在jvm启动时, 就被构造起来的, 负责java平台核心库。(具体上面已经有介绍)

启动类加载实现 (其实我们不用关心这块, 但是有兴趣的, 可以研究一下 ):
bootstrap classLoader 类加载原理探索

?

自定义类加载器加载一个类的步骤 :

classloader 3

?

ClassLoader 类加载逻辑分析, 以下逻辑是除 BootstrapClassLoader 外的类加载器加载流程:

?

    public?class?TestHotSwap?{??public?static?void?main(String?args[])?{??????A?a?=?new?A();??????B?b?=?new?B();??????a.setB(b);?????????System.out.printf("A?classLoader?is?%s?n"?,?a.getClass().getClassLoader());??????System.out.printf("B?classLoader?is?%s?n"?,?b.getClass().getClassLoader());??????System.out.printf("A.b?classLoader?is?%s?n"?,???a.getB().getClass().getClassLoader());?????????HotSwapClassLoader?c1?=?new?HotSwapClassLoader(?new?URL[]{?new?URL(?"file:\e:\test\")}?,?a.getClass().getClassLoader());??????Class?clazz?=?c1.load("?test.hotswap.A?");??????Object?aInstance?=?clazz.newInstance();?????????Method?method1?=?clazz.getMethod("?setB?",?B.class);??????method1.invoke(aInstance,?b);?????????Method?method2?=?clazz.getMethod("?getB?",?null);??????Object?bInstance?=?method2.invoke(aInstance,?null);?????????System.out.printf("?reloaded?A.b?classLoader?is?%s?n",?bInstance.getClass().getClassLoader());??}??}??
?

?

输出

A classLoader is sun.misc.Launcher$AppClassLoader@19821f
B classLoader is sun.misc.Launcher$AppClassLoader@19821f
A.b classLoader is sun.misc.Launcher$AppClassLoader@19821f
reloaded A.b classLoader is sun.misc.Launcher$AppClassLoader@19821f

读书人网 >编程

热点推荐