欢迎来到天天文库
浏览记录
ID:26403686
大小:477.00 KB
页数:17页
时间:2018-11-26
《java类加载机制》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、Java类加载机制(一)译:ayi第一次翻译,翻译得不是很好,请多多指点我的邮箱:nonopo12345@126.com原文:http://www.onjava.com/pub/a/onjava/2005/01/26/classloading.html类加载是java特性的一个重量级的组成部分。尽管,java中“advancedtopics”的发展,使java的类加载机制的地位有所下降。但每位编程着都应该知道这部分的工作机制,以及怎样去更好与其配合。这可以使我们节省很多时间,二不必要浪费在调试ClassNotFoundException,ClassCastExcep
2、tion,等。这篇文章将从最基本的开始,比如代码和数据的关系和区别,以及他们怎么样关系起来形成一个实例或者对象。然后将会说到,java中怎样通过类加载器把代码加载到JVM中,以及java中实现的主要的几种类型的类加载器。然后在这篇文章中我们将会了解到java类加载机制的内幕,我们将使用最基本的代码来描述,这些代码执行与类加载器之后,但在加载一个类之前。在接下来的部分将使用一些例子来强调,对于开发者继承和开发自己的类加载器的必要性。接着将告诉你们怎样编写自己的类加载器,以及怎样使用它们去创建一个一般的能加载包括远程客户端辅助代码的类加载器引擎,以及怎样把它在JVM中定
3、义,实例化,然后执行。习惯上,把J2EE-specificcomponents中说明的作为java类加载的规范,这篇文章正是从这本手册总结来的。类和数据一个类代表一段要执行的代码,然而数据则代表与这些代码相关联的某种状态。状态可以改变,代码不能改变。我们把一种特定状态与一个类关联起来时,就得到了这个类的一个实例。所以同一个类的不同实例有不同的状态,但都参照相同的代码。在java中,一个类通常它的代码就包含在一个.class文件中,虽然其中也包括异常。然而,在java运行时,每个类都会构造一个超类对象(first-classobject),它们其实是java.lang
4、.Class的实例。不论何时编译一个java文件,编译器都会在编译后的字节码中嵌入一个public,static,final型的字段class,这个字段表示的就是一个java.lang.Class型的实例。因为它是public类型的,我们可以通过标识符来访问它,像这样:java.lang.Classklass=Myclass.class;只要一个类被加载到JVM,相同的类(强调:相同的类)将不会被重复加载。这将产生一个问题,什么才是相同的类?一个对象有一种特定状态和标识,对象总是与它所属类联系在一起,与这种状况相似,一个被加载到JVM中类也有特定的标识,接下来我们就
5、阐述:在java中,一个类通过认证的类全名来唯一标识。认证的类全名是由包名和类名两部分组成。但是在一个类被加载到JVM中则是通过认证的类全名,还有加载这个类的加载器来唯一标识。因此,一个类的类名为C1,包名为Pg,被类加载器类KClassLoader的一个实例k1加载,则C1,也就是C1.class,的类实例,在JVM中将被解释为(C1,Pg,k1)。这就意味着两个不同的类加载器实例(Cl,Pg,kl1)和(Cl,Pg,kl2),加载的类在JVM中将有不同的类实例对象,不是类型可比型(type-compatible)的。在JVM中有多少个类加载器实例呢?下面,我们将
6、讲解这个。类加载器在java中,每个类都会被java.lang.ClassLoader的一个实例加载。ClassLoader类处于java.lang包下面,开发者可以自由的创建它的子类,添加自己功能的类加载器。每当敲入javaMyMainClass,一个新的JVM开始时,引导类加载器(bootstrapclassloader)首先会把java中的一些关键类,像java.lang.Objent,和运行时的代码载入内存。这些运行时类打包在JRElibrt.jar文件中。因为是一个本地的接口,我们并不能从java文档中得到引导类加载器(bootstrapclasslo
7、ader)信息。也正是这个原因,引导类加载器(bootstrapclassloader)的表现也根据JVM的不同而异。比如,如果我们试图得到一个核心java运行时类的一个类加载器,我们将得到null值,如下:log(java.lang.String.class.getClassLoader());下面要说到的是java扩展类加载器。在java.ext.dirs路径下面,我们可以放java扩展类库,这样我们可以获得超出java核心运行时类的特性。扩展类加载器(ExtClassLoader)将会加载java.ext.dirs目录下的所有.jar文件。开发者可以为自己
此文档下载收益归作者所有