[讨论] 属性表中属性的区别难道是用字符串匹配?

chenjingbo 2013-01-16
这两天在研究字节码格式..发现一个很有趣的问题.属性表中的属性,之间的区别竟然不是通过类似标志位的形式,而是通过常量池指向utf8的字符串匹配..
    比如我如何判断是ConstantValue类型的属性,是在属性开始的atrribute_name_index指向了常量池中的 字符串 ConstantValue.这样就表示这个是ConstantValue类型的属性..

    我承认我没查过具体的相关源码,只是通过自己试验得出的上面这个非常残酷的结论.所以希望得到指正.谢谢..

    推理过程如下

分析源码

public final class Test {
    final float b = 1.2f;
    final int c = 1;
}


对应的常量池

Constant pool:
   #1 = Methodref          #6.#19         //  java/lang/Object."<init>":()V
   #2 = Float              1.2f
   #3 = Fieldref           #5.#20         //  Test.b:F
   #4 = Fieldref           #5.#21         //  Test.c:I
   #5 = Class              #22            //  Test
   #6 = Class              #23            //  java/lang/Object
   #7 = Utf8               b
   #8 = Utf8               F
   #9 = Utf8               ConstantValue
  #10 = Utf8               c
  #11 = Utf8               I
  #12 = Integer            1
  #13 = Utf8               <init>
  #14 = Utf8               ()V
  #15 = Utf8               Code
  #16 = Utf8               LineNumberTable
  #17 = Utf8               SourceFile
  #18 = Utf8               Test.java
  #19 = NameAndType        #13:#14        //  "<init>":()V
  #20 = NameAndType        #7:#8          //  b:F
  #21 = NameAndType        #10:#11        //  c:I
  #22 = Utf8               Test
  #23 = Utf8               java/lang/Object


对应的字节码
第一个属性是00100007000800010009000000020002
第二个属性是0010000A000B0001000900000002000C

中间的attribute_name_index 都是指向#0009 也就是  #9 = Utf8              ConstantValue


最后吐槽下,怎么传图片啊啊啊啊
RednaxelaFX 2013-01-16
chenjingbo 写道
这两天在研究字节码格式..发现一个很有趣的问题.属性表中的属性,之间的区别竟然不是通过类似标志位的形式,而是通过常量池指向utf8的字符串匹配..
    比如我如何判断是ConstantValue类型的属性,是在属性开始的atrribute_name_index指向了常量池中的 字符串 ConstantValue.这样就表示这个是ConstantValue类型的属性..

    我承认我没查过具体的相关源码,只是通过自己试验得出的上面这个非常残酷的结论.所以希望得到指正.谢谢..

就是字符串匹配没错。这没啥残酷的吧。
当初这样设计是为了后面能更方便的扩展Class文件格式,能够添加新的属性类型而不需要改变Class文件格式的基本设计。使用标志位(flag)的形式每次在添加新属性类型时就得改变这个flag的允许值的定义,颇麻烦。

另外,Class文件里是允许包含JVM规范里未定义的属性的,JVM实现在处理这样的属性时允许忽略掉它们。例如说,我们可以自己在Class文件里嵌个签名啥的,用自定义属性包起来,这样JVM会无视它所以能正常运行,而别人假如直接拿了这个Class文件去用我们也可以发现。类似这样。

chenjingbo 写道
最后吐槽下,怎么传图片啊啊啊啊

ItEye的群组里的论坛貌似就是发不了附件的所以不能直接传图片,而得传到群共享里然后自己在帖里用img标签链过来。
chenjingbo 2013-01-16
谢谢撒迦..
Global site tag (gtag.js) - Google Analytics