重写java.lang.String类时遇到的问题

这两天在做动态污点传播(Dynamic tainting),需要修改java的String类,并导出成jar包,配置在JVM上代替原来的String类运行。可是当在String中添加一个数组:
private boolean taintchar[];

配置后运行时出现以下异常:
Error occurred during initialization of VM 
java.lang.ExceptionInInitializerError
Caused by: java.lang.IllegalArgumentException: name can't be empty
at java.security.BasicPermission.init(Unknown Source)
at java.security.BasicPermission.<init>(Unknown Source)
at java.lang.RuntimePermission.<init>(Unknown Source)
at java.lang.Thread.<clinit>(Unknown Source)


如果改成private boolean barray; 则可正确运行

后来在问答上提问,经虚拟机大神RednaxelaFX指点,找到了问题的原因(以下引用我与RednaxelaFX的问答):
RednaxelaFX:很简单:HotSpot VM对java.lang.String的字段排布是有硬性要求的;如果你要对String的字段个数、类型、名字等做修改,要在HotSpot VM上正常运行就必须连VM也相应的修改。

我:那为什么我在里面加一个boolean类型的就可以,而加一个boolean类型数组就不行。难道只对数组有硬性要求?

RednaxelaFX:因为HotSpot VM对String的字段排布是所有引用类型排在最前面,然后long/double,然后int/float,然后short/char,最后byte/boolean。你加boolean的时候正好加在对象的末尾所以没影响;加数组的时候则改变了原有字段的偏移量,自然会出问题

在此感谢RednaxelaFX,以后要好好了解一下JVM啊
附上fp1203大神对这个问题更详细的分析:http://hllvm.group.iteye.com/group/topic/27856

没有更多推荐了,返回首页