- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Java类加载机制(一)
?
译:ayi? 译文疏漏,请多多指点
原文:/pub/a/onjava/2005/01/26/classloading.html
注:因内容太多,分为一、二两篇文章
?类加载是java特性的一个很重要的部分。尽管,java中“advanced?topics”的发展,使java的类加载机制地位有所下降。但每位编程者都应该知道这部分的工作机制,以及怎样去配合其工作。这可以使我们节省很多时间,而不必要浪费在调试ClassNotFoundException,?ClassCastException,?等。这篇文章将从最基本的开始,比如代码和数据的关系,以及他们怎么样关系起来形成一个实例或者对象。然后将会说到,java中怎样通过类加载器把代码加载到JVM中,以及java中实现的主要的几种类型的类加载器。在这篇文章中,然后我们将会了解到java类加载机制的内幕,我们将使用最基本的代码来描述,这些代码执行于类加载器之后,但在加载一个类之前。在接下来的部分将使用一些例子来证实,对于开发者继承和开发自己的类加载器的必要性。接着将告诉你们怎样编写自己的类加载器,以及怎样使用它们去创建一个一般的能加载包括远程客户端辅助代码的类加载器引擎,以及怎样把它在JVM中定义,实例化,然后执行。习惯上,把J2EE-specific?components?中说明的作为java类加载的规范,这篇文章正是从这本手册总结来的。
类和数据
一个类代表一段要执行的代码,然而数据则代表与这些代码相关联的某种状态。状态可以改变,代码不能改变。我们把一种特定状态与一个类关联起来时,就得到了这个类的一个实例。所以同一个类的不同实例有不同的状态,但都参照相同的代码。在java中,一个类通常它的代码就包含在一个?.class?文件中,虽然其中也包括异常。然而,在java运行时,每个类都会构造一个超类对象(first-class?object),它们其实是java.lang.Class的实例。不论何时编译一个java文件,编译器都会在编译后的字节码中嵌入一个public,?static,?final型的字段class,这个字段表示的就是一个java.lang.Class型的实例。因为它是public类型的,我们可以通过标识符来访问它,像这样:
java.lang.Class?klass?=?Myclass.class;?
只要一个类被加载到JVM,相同的类(强调:相同的类)将不会被重复加载。这将产生一个问题,什么才是相同的类?一个对象有一种特定状态和标识,对象总是与它所属类联系在一起,与这种状况相似,一个被加载到JVM中类也有特定的标识,接下来我们就阐述:
?在java中,一个类通过认证的类全名来唯一标识。认证的类全名是由包名和类名两部分组成。但是在一个类被加载到JVM中则是通过认证的类全名,还有加载这个类的加载器来唯一标识。因此,一个类的类名为C1,包名为Pg,被类加载器类KClassLoader的一个实例k1加载,则C1,也就是C1.class?,的类实例,在JVM中将被解释为(C1,Pg,k1)。这就意味着两个不同的类加载器实(Cl,?Pg,?kl1)?和?(Cl,?Pg,?kl2)?,加载的类在JVM中将有不同的类实例对象,不是类型可比型(type-compatible)的。在JVM中有多少个类加载器实例呢?下面,我们将讲解这个。
类加载器
在java中,每个类都会被java.lang.ClassLoader的一个实例加载。ClassLoader类处于java.lang
包下面,开发者可以自由的创建它的子类,添加自己功能的类加载器。
?
每当敲入java?MyMainClass,一个新的JVM开始时,引导类加载器(bootstrap?class?loader?)首先会把java中的一些关键类,像java.lang.Objent,和运行时的代码载入内存。这些运行时类打包在?JRE\lib\rt.jar文件中。因为是一个本地的接口,我们并不能从java文档中得到引导类加载器(bootstrap?class?loader?)信息。也正是这个原因,引导类加载器(bootstrap?class?loader?)的表现也根据JVM的不同而异。
比如,如果我们试图得到一个核心java运行时类的一个类加载器,我们将得到null值,如下:
log(java.lang.String.class.getClassLoader());?
下面要说到的是java扩展类加载器。在java.ext.dirs?路径下面,我们可以放java扩展类库,这样我们可以获得超出java核心运行时类的特性。扩展类加载器(ExtClassLoader)将会加载java.ext.dirs目录下的所有
文档评论(0)