重写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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值