freezingfa
自闭小哈
2011-10-12 10:30

修改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[]; 也不行。
百思不得其解,有人知道是怎么回事么?

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

15条回答

  • rednaxelafx rednaxelafx 10年前

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

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

    点赞 评论 复制链接分享
  • aini3456 aini3456 10年前

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

    点赞 评论 复制链接分享
  • rednaxelafx rednaxelafx 10年前

    联动一下

    [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 rednaxelafx 10年前

    回复@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]
    我也在这里的…

    点赞 评论 复制链接分享
  • long13131462101 long13131462101 10年前

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

    点赞 评论 复制链接分享
  • DreamZhong DreamZhong 10年前

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

    点赞 评论 复制链接分享
  • aini3456 aini3456 10年前
    点赞 评论 复制链接分享
  • DreamZhong DreamZhong 10年前

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

    点赞 评论 复制链接分享
  • long13131462101 long13131462101 10年前

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

    点赞 评论 复制链接分享
  • aini3456 aini3456 10年前

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

    点赞 评论 复制链接分享
  • DreamZhong DreamZhong 10年前

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

    点赞 评论 复制链接分享
  • DreamZhong DreamZhong 10年前

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

    点赞 评论 复制链接分享
  • long13131462101 long13131462101 10年前

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

    建议别改

    点赞 评论 复制链接分享
  • AngelAndAngel AngelAndAngel 10年前

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

    点赞 评论 复制链接分享
  • long13131462101 long13131462101 10年前

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

    点赞 评论 复制链接分享