修改java.lang.String类时出错?

本人想修改java.lang.String类,然后导出成jar,代替原来虚拟机的String类使用,但是在添加一个布尔数组后,导出成jar并使用时出现下面的错误:

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.(Unknown Source)
at java.lang.RuntimePermission.(Unknown Source)
at java.lang.Thread.(Unknown Source)

添加的数组形式如下:
private boolean barray[];

如果改成private boolean barray; 则可正确运行。
如果改成跟String源码中的value一样:private final char value[]; 也不行。
百思不得其解,有人知道是怎么回事么?

还是请在[url=http://hllvm.group.iteye.com/]高级语言虚拟机[/url]群组新开个帖来讨论吧?问答频道上讨论很费力。

请先说明为什么要加字段。或许有别的办法能实现你的真实需求。改VM是个精密工作,除非你有信息、有能力、有毅力去维护你的修改,不然我不建议在生产环境对VM做任何修改。我们这边也费了九牛二虎之力才说服PE部署我们修改过的VM…

[code="java"]String是final类型不能修改,不能被继承呀 [/code]

这个类还是不要改动的好,越基础的类,改动风险非常大,像这个类是约定好了的,基本上是所以其他api的基础,不可以改的。

[code="java"]这个类还是不要改动的好,越基础的类,改动风险非常大,像这个类是约定好了的,基本上是所以其他api的基础,不可以改的。[/code]

建议别改

String类是final类型,不可继承,不知道是什么样复杂的需求让你需要修改String类?如果想修改String类,还是自己去写一个类似实现String功能的类,再在项目中使用即可,不过这样的工作量有点大哦。

private boolean barray[]
这数组应该是这样定义的吧
private boolean[] barray

[quote]改成private boolean barray; 则可正确运行[/quote]
那你试试改成private boolean[] barray;可不可以

对[code="java"]private boolean[] barray;[/code]

[quote]xbootclasspath命令使虚拟机在调用原来的String类时先调用它[/quote]
想知道你所说的打包jar是把整个jdk打包?还是说你修改的String类就是一个你自定义的类呢?还有就是你的命令是如何写的?

:oops: 那你去问问[quote]http://weibo.com/rednaxelafx[/quote]吧,虚拟机大牛

[quote]只是新建一个java.lang的包,然后在里面新建一个String类,而且只有这一个类,名字跟java的String是一样的,内容跟它也一样,只是增加修改了一点。
没有使用什么命令,我用的是Eclipse开发,它里面的运行配置里可以进行配置 [/quote]
如果是这样那你能否试试将这个类的名字改改,换成另一个与String不冲突的名呢?

[code="java"]你用StringBuffer试试[/code]

回复@FAvril:很简单:HotSpot VM对java.lang.String的字段排布是有硬性要求的;如果你要对String的字段个数、类型、名字等做修改,要在HotSpot VM上正常运行就必须连VM也相应的修改。

[url]http://hg.openjdk.java.net/jdk6/jdk6/hotspot/file/dc40301aed45/src/share/vm/classfile/classFileParser.cpp[/url]
<< 3288行

[url]http://hg.openjdk.java.net/jdk6/jdk6/hotspot/file/dc40301aed45/src/share/vm/classfile/javaClasses.hpp[/url]
<< 53行

[url]http://hg.openjdk.java.net/jdk6/jdk6/hotspot/file/dc40301aed45/src/share/vm/classfile/javaClasses.cpp[/url]
<< 97行

[quote="fire_wang"]那你去问问
[quote]http://weibo.com/rednaxelafx[/quote]
吧,虚拟机大牛[/quote]
我也在这里的…

联动一下

[quote="FAvril"]噢,是这样~谢谢。那为什么我在里面加一个boolean类型的就可以,而加一个boolean类型数组就不行。难道只对数组有硬性要求?[/quote]

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

顺带:欢迎到[url=http://hllvm.group.iteye.com/]高级语言虚拟机[/url]群组讨论这类问题

呵呵,希望RednaxelaFX可以给我们普及一下JVM的知识