Java SE 6.0的改變包括了ClassFile格式的改變。
新的版本的ClassFile中major_version為0x0032,也就是50。
Java SE 6 : 0x0032?? (用自己寫的ClassFileParser分析過證實)
Java SE 5 : 0x0031??(用自己寫的ClassFileParser分析過證實)
JDK 1.4?? : (未經證實是0x0030)?
JDK 1.3?? :? (未經證實是0x002F)
JDK 1.2?? : 0x002E
JDK 1.1?? : 0x002D??
每次JDK大版本升級,ClassFile格式都改變,然后版本加1。
6.0增加了StackMapTable的Attribute。
要提一下三個byte code處理庫:
ObjectWeb ASM
Apache BCEL
sourceforge SERP
ASM目前版本為3.0。其2.1版本開始支持StackMapTableAttribute。
其中ASM 2.1支持StackMapTableAttribute,BCEL 5.2似乎只支持JDK 1.3,SERP 1.12只支持JDK 5.0。
Aapche BCEL支持JDK 1.3,是從代碼中猜測的,沒有從文檔中看到,但其中5.2版本的ClassParser的確是不支持StackMapTable Attribute,其代碼中的StackMap和Java SE 6.0的StackMapTable Attribute沒有任何關系。BCEL中的對象和ClassFile中的各項對應,用于學習分析方便。
ASM號稱更小,速度更快。現在流行的Eclipse插件bytecode outline也是其中的子項目。
ASM可以直接cvs訪問,提供的代碼是一個Eclipse Project,十分方便,我很喜歡!
http://forge.objectweb.org/projects/asm/
在規范4.10.1中的這一段話有些疑問:
If the class file version number is 51.0 or above, then neither the jsr opcode or the jsr_w opcode may appear in the code array.
class file version number is 51.0 or above,什么意思?Java SE 6.0編譯出倆的結果應該是50.x,這是怎么回事?
規范是一個186頁的PDF,沒有文檔大綱,看暈了