时间:2021-05-19
摘要
Java的类装载器是Java动态性的核心,本文将向大家简要介绍Java的类装载器,及相关的parentdelegation模型,命名空间,运行时包等概念,同时讨论一些在学习中容易混淆的问题。
类装载器的功能及分类
顾名思义,类装载器是用来把类(class)装载进JVM的。JVM规范定义了两种类型的类装载器:启动类装载器(bootstrap)和用户自定义装载器(user-definedclassloader)。
bootstrap是JVM自带的类装载器,用来装载核心类库,如java.lang.*等。如java.lang.Object是由bootstrap装载的。
Java提供了抽象类ClassLoader,所有用户自定义类装载器都实例化自ClassLoader的子类。SystemClassLoader是一个特殊的用户自定义类装载器,由JVM的实现者提供,在编程者不特别指定装载器的情况下默认装载用户类。系统类装载器可以通过ClassLoader.getSystemClassLoader()方法得到。
例1,测试你所使用的JVM的ClassLoader
publicclassLoaderSample1{publicstaticvoidmain(String[]args){Classc;ClassLoadercl;
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'sloaderis"+cl);c=Class.forName("LoaderSample1");cl=c.getClassLoader();System.out.println("LoaderSample1'sloaderis"+cl);}catch(Exceptione){e.printStackTrace();}}}
在我的机器上(SunJava1.5)的运行结果
C:\java>javaLoaderSample1
sun.misc.Launcher$AppClassLoader@82ba41
sun.misc.Launcher$ExtClassLoader@923e30
null
java.lang.Object'sloaderisnull
LoaderSample1'sloaderissun.misc.Launcher$AppClassLoader@82ba41
第一行表示,系统类装载器实例化自类sun.misc.Launcher$AppClassLoader
第二行表示,系统类装载器的parent实例化自类sun.misc.Launcher$ExtClassLoader
第三行表示,系统类装载器parent的parent为bootstrap
第四行表示,核心类java.lang.Object是由bootstrap装载的
第五行表示,用户类LoaderSample1是由系统类装载器装载的
parentdelegation模型
从1.2版本开始,Java引入了双亲委托模型,从而更好的保证Java平台的安全。在此模型下,当一个装载器被请求装载某个类时,它首先委托自己的parent去装载,若parent能装载,则返回这个类所对应的Class对象,若parent不能装载,则由parent的请求者去装载。
如图1所示,loader2的parent为loader1,loader1的parent为systemclassloader。假设loader2被要求装载类MyClass,在parentdelegation模型下,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的初始类装载器。
12下一页阅读全文
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
本篇介绍下JAXB进阶使用,命名空间处理使用package-info.java添加默认命名空间在需要添加命名空间的包下面添加package-info.java文
数据库命名规范1目的规范数据库各种对象的命名规则。2数据库命名原则2.1数据文件如果数据库采用文件系统,而不是裸设备,约定下列命名规则:1)数据文件以表空间名为
1.用Pascal规则来命名方法和类型。publicclassDataGrid{publicvoidDataBind(){}}2.用Camel规则来命名局部变量
Python命名空间和作用域总结emmm,这一块讲了2个内容,一个是命名空间,一个是作用域。一个一个说吧命名空间Anamespaceisamappingfrom
1基本概念1.1命名空间(namespace)命名空间是变量名到对象的映射(name->obj)。目前大多数的命名空间以类似于python字典的形式实现,实现形