constant pool中double 和long变量是到底怎么写入的
时间:2008-01-16 12:57:53 来源: 作者:
|
在编一个读.class file的java程序。 程序基本正常,但是当源程序中有double或long常量的时候,对constant pool的读取就会出问题。读取的序号会发生混乱。我调了很久也没能解决。 jvm的规范说遇到这两种常量在读.class文件时要跳过一个entry。我的理解是正常读下一个entry,然后把序号加一,从再下一个entry开始视为有效entry。可是这样做了之后,发现总的entry少了一个。读到最后一个constant已经越界了。 这个问题不好说清楚。有谁做过类似的事情,能说一下对jvm规范里下面这句话的正确理解吗。 All eight-byte constants take up two entries in the constant_pool table of the class file, as well as in the in-memory version of the constant pool that is constructed when a class file is read. If a CONSTANT_Long_info or CONSTANT_Double_info structure is the item in the constant_pool table at index n, then the next valid item in the pool is located at index n+2. The constant_pool index n+1 must be considered invalid and must not be used. 先谢谢了! sakulagi 回复于:2004-10-12 12:54:16 因为double和long的需要的长度是constant_pool_entry能提供的长度的两倍。所以下一个constant要跳过一个再读。比如第n个entry是double,那么下一个有效的entry是第n+2个。第n个和第n+1个内容合在一起才是这个double的数值。 entry的数量是固定的。里面有多少个“有效的”constant entry可能需要自己来维护计数了。我没有仔细度过class specification。我读一下我们再继续讨论吧。 toughwu 回复于:2004-10-13 02:46:39 谢谢,要跳过一个entry是肯定的 但是到底怎么跳就是问题了。你说超过了一个entry能提供的最大长度,可是这个最大长度是多少,在规范里并没有说明。 以我的理解,entry并没有固定的长度。所以我所做的是读完double entry之后,读入一个byte,看下一个entry是什么类型,以类型来决定要跳过的长度。 这样做是我能理解的最合理的做法了。可是好像仍然不对。跳过的entry里面有内容,如果读出来看上去是很合理的东西。如果有好几个long或者double,跳过之后就乱套了。constant之间的指针都乱了。 所以想知道编译器在写class file时,到底是怎样写下一个entry的。是写一个随机生成的constant,还是有什么规则。或者写入的不是一个完整的entry,只是按照某种规则添加几个空byte以用掉被double侵占了一部分字节的下一个entry。 toughwu 回复于:2004-10-13 04:07:38 问题已经解决了,还是我对规范没理解对。 实际上问题很简单 在读entry的时候不跳过任何字节或entry 要跳的只是index号 也就是说读进来的下一个entry放在n+2号index里 对index n+1实际上什么都没有做 sakulagi 回复于:2004-10-13 08:21:43 呵呵。我自己晕了。这个index具体是怎么使用的?楼上的朋友能不能简单解释一下? |
原文链接:http://bbs.chinaunix.net/viewthread.php?tid=423104 转载请注明作者名及原文出处 |
上一篇: java 的问题
下一篇: 如何改变JDialog标题栏上的图标?










文章评论
共有 位网友发表了评论 查看完整内容