java 命名空间 命名规则第1/2页
程序员文章站
2022-06-30 10:27:45
摘要 ...
摘要
java的类装载器是java动态性的核心,本文将向大家简要介绍java的类装载器,及相关的parent delegation模型,命名空间,运行时包等概念,同时讨论一些在学习中容易混淆的问题。
类装载器的功能及分类
顾名思义,类装载器是用来把类(class)装载进jvm的。jvm规范定义了两种类型的类装载器:启动类装载器(bootstrap)和用户自定义装载器(user-defined class loader)。
bootstrap是jvm自带的类装载器,用来装载核心类库,如java.lang.*等。如java.lang.object是由bootstrap装载的。
java提供了抽象类classloader,所有用户自定义类装载器都实例化自classloader的子类。 system class loader是一个特殊的用户自定义类装载器,由jvm的实现者提供,在编程者不特别指定装载器的情况下默认装载用户类。系统类装载器可以通过classloader.getsystemclassloader() 方法得到。
例1,测试你所使用的jvm的classloader
/*loadersample1.java*/public class loadersample1 { public static void main(string[] args) { class c; classloader cl;
cl = classloader.getsystemclassloader(); system.out.println(cl);
while (cl != null) { cl = cl.getparent(); system.out.println(cl); } try { c = class.forname("java.lang.object"); cl = c.getclassloader(); system.out.println("java.lang.object's loader is " + cl); c = class.forname("loadersample1"); cl = c.getclassloader(); system.out.println("loadersample1's loader is " + cl); } catch (exception e) { e.printstacktrace(); } }}
在我的机器上(sun java 1.5)的运行结果
c:\java>java loadersample1
sun.misc.launcher$appclassloader@82ba41
sun.misc.launcher$extclassloader@923e30
null
java.lang.object's loader is null
loadersample1's loader is sun.misc.launcher$appclassloader@82ba41
第一行表示,系统类装载器实例化自类sun.misc.launcher$appclassloader
第二行表示,系统类装载器的parent实例化自类sun.misc.launcher$extclassloader
第三行表示,系统类装载器parent的parent为bootstrap
第四行表示,核心类java.lang.object是由bootstrap装载的
第五行表示,用户类loadersample1是由系统类装载器装载的
parent delegation模型
从1.2版本开始,java引入了双亲委托模型,从而更好的保证java平台的安全。在此模型下,当一个装载器被请求装载某个类时,它首先委托自己的parent去装载,若parent能装载,则返回这个类所对应的class对象,若parent不能装载,则由parent的请求者去装载。
如图1所示,loader2的parent为loader1,loader1的parent为system class loader。假设loader2被要求装载类myclass,在parent delegation模型下,loader2首先请求loader1代为装载,loader1再请求系统类装载器去装载myclass。若系统装载器能成功装载,则将myclass所对应的class对象的reference返回给loader1,loader1再将reference返回给loader2,从而成功将类myclass装载进虚拟机。若系统类装载器不能装载myclass,loader1会尝试装载myclass,若loader1也不能成功装载,loader2会尝试装载。若所有的parent及loader2本身都不能装载,则装载失败。
若有一个能成功装载,实际装载的类装载器被称为定义类装载器,所有能成功返回class对象的装载器(包括定义类装载器)被称为初始类装载器。如图1所示,假设loader1实际装载了myclass,则loader1为myclass的定义类装载器,loader2和loader1为myclass的初始类装载器。
java的类装载器是java动态性的核心,本文将向大家简要介绍java的类装载器,及相关的parent delegation模型,命名空间,运行时包等概念,同时讨论一些在学习中容易混淆的问题。
类装载器的功能及分类
顾名思义,类装载器是用来把类(class)装载进jvm的。jvm规范定义了两种类型的类装载器:启动类装载器(bootstrap)和用户自定义装载器(user-defined class loader)。
bootstrap是jvm自带的类装载器,用来装载核心类库,如java.lang.*等。如java.lang.object是由bootstrap装载的。
java提供了抽象类classloader,所有用户自定义类装载器都实例化自classloader的子类。 system class loader是一个特殊的用户自定义类装载器,由jvm的实现者提供,在编程者不特别指定装载器的情况下默认装载用户类。系统类装载器可以通过classloader.getsystemclassloader() 方法得到。
例1,测试你所使用的jvm的classloader
/*loadersample1.java*/public class loadersample1 { public static void main(string[] args) { class c; classloader cl;
cl = classloader.getsystemclassloader(); system.out.println(cl);
while (cl != null) { cl = cl.getparent(); system.out.println(cl); } try { c = class.forname("java.lang.object"); cl = c.getclassloader(); system.out.println("java.lang.object's loader is " + cl); c = class.forname("loadersample1"); cl = c.getclassloader(); system.out.println("loadersample1's loader is " + cl); } catch (exception e) { e.printstacktrace(); } }}
在我的机器上(sun java 1.5)的运行结果
c:\java>java loadersample1
sun.misc.launcher$appclassloader@82ba41
sun.misc.launcher$extclassloader@923e30
null
java.lang.object's loader is null
loadersample1's loader is sun.misc.launcher$appclassloader@82ba41
第一行表示,系统类装载器实例化自类sun.misc.launcher$appclassloader
第二行表示,系统类装载器的parent实例化自类sun.misc.launcher$extclassloader
第三行表示,系统类装载器parent的parent为bootstrap
第四行表示,核心类java.lang.object是由bootstrap装载的
第五行表示,用户类loadersample1是由系统类装载器装载的
parent delegation模型
从1.2版本开始,java引入了双亲委托模型,从而更好的保证java平台的安全。在此模型下,当一个装载器被请求装载某个类时,它首先委托自己的parent去装载,若parent能装载,则返回这个类所对应的class对象,若parent不能装载,则由parent的请求者去装载。
如图1所示,loader2的parent为loader1,loader1的parent为system class loader。假设loader2被要求装载类myclass,在parent delegation模型下,loader2首先请求loader1代为装载,loader1再请求系统类装载器去装载myclass。若系统装载器能成功装载,则将myclass所对应的class对象的reference返回给loader1,loader1再将reference返回给loader2,从而成功将类myclass装载进虚拟机。若系统类装载器不能装载myclass,loader1会尝试装载myclass,若loader1也不能成功装载,loader2会尝试装载。若所有的parent及loader2本身都不能装载,则装载失败。
若有一个能成功装载,实际装载的类装载器被称为定义类装载器,所有能成功返回class对象的装载器(包括定义类装载器)被称为初始类装载器。如图1所示,假设loader1实际装载了myclass,则loader1为myclass的定义类装载器,loader2和loader1为myclass的初始类装载器。
1
上一篇: 为什么中秋吃月饼,这其中的知识你知道哪些
下一篇: 春节不吃什么食物就不算过春节,你知道吗?