|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
主要缺点就是:速度比较慢,没有C和C++快
本文是这个新系列文章的第一篇,该系列文章将会商我称之为Java编程的静态性的一系列主题。这些主题的局限从Java二进制类文件格局的基础布局,和利用反射举行运转时元数据会见,一向到在运转时修正和机关新类。贯串整篇文章的大众线索是如许一种头脑:在Java平台上编程要比利用间接编译本钱机代码的言语更具静态性。假如您了解了这些动态方面,就能够利用Java编程完成那些在任何别的支流编程言语中不克不及完成的事变。
本文中,我将会商一些基础观点,它们是这些Java平台静态特征的基本。这些观点的核心是用于暗示Java类的二进制格局,包含这些类装进到JVM时所产生的情形。本文不但是本系列其他几篇文章的基本,并且还演示了开辟职员在利用Java平台时碰着的一些十分实际的成绩。
用二进制暗示的类
利用Java言语的开辟职员在用编译器编译他们的源代码时,一般不用体贴对这些源代码做了些甚么如许的细节。可是本系列文章中,我将会商从源代码到实行程序所触及的很多幕后细节,因而我将起首切磋由编译器天生的二进制类。
二进制类格局实践上是由JVM标准界说的。一般这些类暗示是由编译器从Java言语源代码天生的,并且它们一般存储在扩大名为.class的文件中。可是,这些特征都可有可无。已开辟了可使用Java二进制类格局的别的一些编程言语,并且出于某些目标,还构建了新的类暗示,并被当即装进到运转中的JVM。就JVM而言,主要的部分不是源代码和怎样存储源代码,而是格局自己。
那末这个类格局实践看上往是甚么样呢?清单1供应了一个(十分)冗长的类的源代码,还附带了由编译器输入的类文件的部分十六进制显现:
清单1.Hello.java的源代码和(部分)二进制类文件
publicclassHello
{
publicstaticvoidmain(String[]args){
System.out.println("Hello,World!");
}
}
0000:cafebabe0000002e001a0a0006000c09 ................
0010:000d000e08000f0a0010001107001207 ................
0020:00130100063c696e69743e0100032829 .....<init>...()
0030:56010004436f64650100046d61696e01 V...Code...main.
0040:0016285b4c6a6176612f6c616e672f53 ..([Ljava/lang/S
0050:7472696e673b29560c00070008070014 tring;)V........
0060:0c0015001601000d48656c6c6f2c2057 ........Hello,W
0070:6f726c64210700170c00180019010005 orld!...........
0080:48656c6c6f0100106a6176612f6c616e Hello...java/lan
0090:672f4f626a6563740100106a6176612f g/Object...java/
00a0:6c616e672f53797374656d0100036f75 lang/System...ou
...
二进制类文件的内情
清单1显现的二进制类暗示中起首是“cafebabe”特性符,它标识Java二进制类格局(并特地作为一个永世的D但在很年夜水平上未被熟悉到的D礼品送给勉力事情的barista,他们本着开辟职员所具有的精力构建Java平台)。这个特性符刚好是一种考证一个数据块的确声明成Java类格局的一个实例的复杂办法。任何Java二进制类(乃至是文件体系中没有呈现的类)都必要以这四个字节作为入手下手。
该数据的其他部分不太吸惹人。该特性符以后是一对类格局版本号(本例中,是由1.4.1javac天生的次版本0和主版本46D用十六进制暗示就是0x2e),接着是常量池中项的总数。项总数(本例中,是26,或0x001a)前面是实践的常量池数据。这里放着类界说所用的一切常量。它包含类名和办法名、特性符和字符串(您能够在十六进制转储右边的文本注释中辨认它们),另有各类二进制值。
常量池中各项的长度是可变的,每项的第一个字节标识项的范例和对它解码的体例。这里我不具体探求一切这些内容的细节,假如感乐趣,有很多可用的的参考材料,从实践的JVM标准入手下手。关头的地方在于常量池包括对该类所用的别的类和办法的一切援用,还包括了该类及其办法的实践界说。常量池常常占到二进制类巨细的一半或更多,但均匀上去大概要少一些。
常量池前面另有几项,它们援用了类自己、其超类和接口的常量池项。这些项前面是有关字段和办法的信息,它们自己用庞大布局暗示。办法的可实行代码以包括在办法界说中的代码属性的情势呈现。用JVM的指令情势暗示该代码,一样平常称为字节码,这是下一节要讨论的主题之一。
在Java类格局中,属性被用于几个已界说的用处,包含已提到的字节码、字段的常量值、非常处置和调试信息。可是属性并不是只大概用于这些用处。从一入手下手,JVM标准就已经请求JVM疏忽未知范例的属性。这一请求所带来的天真性使得未来能够扩大属性的用法以满意别的用处,比方供应利用用户类的框架所需的元信息,这类办法在Java派生的C#语言中已普遍利用。遗憾的是,关于在用户级使用这一天真性还没有供应任何挂钩。
<p>
比如模式、敏捷方法什么的,这些思想好,但是实施的人没有理解而且没有正确运用这些知识导致了开发周期的延长。比如说对象,通过getName()方法不能获取对象的名字。 |
|