从基本结构到Java 7新特性(4)

发表于:2013-01-05来源:ImportNew作者:朱伟杰点击数: 标签:java
下面的表格给出了字节码表达式的几个实例。 表二:Java字节码表达式范例 Java Code Java Bytecode Expression double d[ ][ ][ ]; [[[D Object mymethod(int I, double d, Thread t)

  下面的表格给出了字节码表达式的几个实例。

  表二:Java字节码表达式范例

Java Code Java Bytecode Expression
double d[ ][ ][ ]; [[[D
Object mymethod(int I, double d, Thread t) (IDLjava/lang/Thread;)Ljava/lang/Object;

  想了解更多细节的话,参考《The java Virtual Machine Specification,第二版》中的“4.3 Descriptors"。想了解更多的Java字节码的指令的话,参考《The Java Virtual Machined Instruction Set》的“6.The Java Virtual Machine Instruction Set"

  Class文件格式

  在讲解Java class文件格式之前,我们先看看一个在Java Web应用中经常出现的问题。

  现象

  当我们编写完jsp代码,并且在Tomcat运行时,Jsp代码没有正常运行,而是出现了下面的错误。

1
2
Servlet.service() for servlet jsp threw exception org.apache.jasper.JasperException: Unable to compile class for JSP Generated servlet error:
The code of method _jspService(HttpServletRequest, HttpServletResponse) is exceeding the 65535 bytes limit"

  原因

  在不同的Web服务器上,上面的错误信息可能会有点不同,不过有有一点肯定是相同的,它出现的原因是65535字节的限制。这个65535字节的限制是JVM规范里的限制,它规定了一个方法的大小不能超过65535字节。

  下面我会更加详细地讲解这个65535字节限制的意义以及它出现的原因。

  Java字节码里的分支和跳转指令分别是”goto"和"jsr"。

1
2
goto [branchbyte1] [branchbyte2]
jsr [branchbyte1] [branchbyte2]

  这两个指令都接收一个2字节的有符号的分支跳转偏移量做为操作数,因此偏移量最大只能达到65535。不过,为了支持更多的跳转,Java字节码提供了"goto_w"和"jsr_w"这两个可以接收4字节分支偏移的指令。

1
2
goto_w [branchbyte1] [branchbyte2] [branchbyte3] [branchbyte4]
jsr_w [branchbyte1] [branchbyte2] [branchbyte3] [branchbyte4]

  有了这两个指令,索引超过65535的分支也是可用的。因此,Java方法的65535字节的限制就可以解除了。不过,由于Java class文件的更多的其他的限制,使得Java方法还是不能超过65535字节。

  为了展示其他的限制,我会简单讲解一下class 文件的格式。

  Java class文件的大致结构如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
ClassFile {
    u4 magic;
    u2 minor_version;
    u2 major_version;
    u2 constant_pool_count;
    cp_info constant_pool[constant_pool_count-1];
    u2 access_flags;
    u2 this_class;
    u2 super_class;
    u2 interfaces_count;
    u2 interfaces[interfaces_count];
    u2 fields_count;
    field_info fields[fields_count];
    u2 methods_count;
    method_info methods[methods_count];
    u2 attributes_count;
    attribute_info attributes[attributes_count];}

原文转自:http://www.ltesting.net