预览加载中,请您耐心等待几秒...
1/10
2/10
3/10
4/10
5/10
6/10
7/10
8/10
9/10
10/10

亲,该文档总共17页,到这已经超出免费预览范围,如果喜欢就直接下载吧~

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

Java类加载机制(一) 译:ayi第一次翻译,翻译得不是很好,请多多指点 我的邮箱:nonopo12345@126.com 原文:HYPERLINK"http://www.onjava.com/pub/a/onjava/2005/01/26/classloading.html"http://www.onjava.com/pub/a/onjava/2005/01/26/classloading.html 类加载是java特性的一个重量级的组成部分。尽管,java中“advancedtopics”的发展,使java的类加载机制的地位有所下降。但每位编程着都应该知道这部分的工作机制,以及怎样去更好与其配合。这可以使我们节省很多时间,二不必要浪费在调试HYPERLINK"http://java.sun.com/j2se/1.5.0/docs/api/java/lang/ClassNotFoundException.html"ClassNotFoundException,HYPERLINK"http://java.sun.com/j2se/1.5.0/docs/api/java/lang/ClassCastException.html"ClassCastException,等。 这篇文章将从最基本的开始,比如代码和数据的关系和区别,以及他们怎么样关系起来形成一个实例或者对象。然后将会说到,java中怎样通过类加载器把代码加载到JVM中,以及java中实现的主要的几种类型的类加载器。然后在这篇文章中我们将会了解到java类加载机制的内幕,我们将使用最基本的代码来描述,这些代码执行与类加载器之后,但在加载一个类之前。在接下来的部分将使用一些例子来强调,对于开发者继承和开发自己的类加载器的必要性。接着将告诉你们怎样编写自己的类加载器,以及怎样使用它们去创建一个一般的能加载包括远程客户端辅助代码的类加载器引擎,以及怎样把它在JVM中定义,实例化,然后执行。习惯上,把J2EE-specificcomponents中说明的作为java类加载的规范,这篇文章正是从这本手册总结来的。 类和数据 一个类代表一段要执行的代码,然而数据则代表与这些代码相关联的某种状态。状态可以改变,代码不能改变。我们把一种特定状态与一个类关联起来时,就得到了这个类的一个实例。所以同一个类的不同实例有不同的状态,但都参照相同的代码。在java中,一个类通常它的代码就包含在一个.class文件中,虽然其中也包括异常。然而,在java运行时,每个类都会构造一个超类对象(first-classobject),它们其实是java.lang.Class的实例。不论何时编译一个java文件,编译器都会在编译后的字节码中嵌入一个public,static,final型的字段class,这个字段表示的就是一个java.lang.Class型的实例。因为它是public类型的,我们可以通过标识符来访问它,像这样: java.lang.Classklass=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 包下面,开发者可以自由的创建它的子类,添加自己功能的类加载器。 每当敲入javaMyMainClass,一个新的JVM开始时,引导类加载器(bootstrapclassloader )首先会把java中的一些关键类,像java.lang.Objent,和运行时的代码载入内存。这些运行时类打包在JRE\lib\rt.jar 文件中。因为是一个本地的接口,我们并不能从java文档中得到引导类加载器(bootstrapclassloader)信息