-
修改java.lang.String类时出错?5
本人想修改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.<init>(Unknown Source)
at java.lang.RuntimePermission.<init>(Unknown Source)
at java.lang.Thread.<clinit>(Unknown Source)
添加的数组形式如下:
private boolean barray[];
如果改成private boolean barray; 则可正确运行。
如果改成跟String源码中的value一样:private final char value[]; 也不行。
百思不得其解,有人知道是怎么回事么?
问题补充:对的,我知道。我只是重新写了String类,然后导出成jar包,再用xbootclasspath命令使虚拟机在调用原来的String类时先调用它高级java工程师 写道String是final类型不能修改,不能被继承呀
问题补充:不行。。。
这应该不是编译有问题
是导出成jar包后放到虚拟机运行时,虚拟机初始化出现问题
本人对虚拟机的知识不大了解,也没什么头绪fire_wang 写道引用改成private boolean barray; 则可正确运行
那你试试改成private boolean[] barray;可不可以
问题补充:只是新建一个java.lang的包,然后在里面新建一个String类,而且只有这一个类,名字跟java的String是一样的,内容跟它也一样,只是增加修改了一点。
没有使用什么命令,我用的是Eclipse开发,它里面的运行配置里可以进行配置Wind_ZhongGang 写道引用xbootclasspath命令使虚拟机在调用原来的String类时先调用它
想知道你所说的打包jar是把整个jdk打包?还是说你修改的String类就是一个你自定义的类呢?还有就是你的命令是如何写的?
问题补充:谢谢你的介绍,果然是位虚拟机大牛~fire_wang 写道那你去问问引用http://weibo.com/rednaxelafx吧,虚拟机大牛
问题补充:非常感谢~
那请问有什么方法可以在里面加一个boolean数组呢?
修改vm应该怎么修改?不好意思,我对虚拟机挺陌生
RednaxelaFX 写道联动一下
FAvril 写道噢,是这样~谢谢。那为什么我在里面加一个boolean类型的就可以,而加一个boolean类型数组就不行。难道只对数组有硬性要求?
RednaxelaFX 写道回复@FAvril:因为HotSpot VM对String的字段排布是所有引用类型排在最前面,然后long/double,然后int/float,然后short/char,最后byte/boolean。你加boolean的时候正好加在对象的末尾所以没影响;加数组的时候则改变了原有字段的偏移量,自然会出问题
顺带:欢迎到高级语言虚拟机群组讨论这类问题
2011年10月12日 10:30
15个答案 按时间排序 按投票排序
-
采纳的答案
还是请在高级语言虚拟机群组新开个帖来讨论吧?问答频道上讨论很费力。
请先说明为什么要加字段。或许有别的办法能实现你的真实需求。改VM是个精密工作,除非你有信息、有能力、有毅力去维护你的修改,不然我不建议在生产环境对VM做任何修改。我们这边也费了九牛二虎之力才说服PE部署我们修改过的VM…2011年10月12日 13:32
-
联动一下
FAvril 写道噢,是这样~谢谢。那为什么我在里面加一个boolean类型的就可以,而加一个boolean类型数组就不行。难道只对数组有硬性要求?
RednaxelaFX 写道回复@FAvril:因为HotSpot VM对String的字段排布是所有引用类型排在最前面,然后long/double,然后int/float,然后short/char,最后byte/boolean。你加boolean的时候正好加在对象的末尾所以没影响;加数组的时候则改变了原有字段的偏移量,自然会出问题
顺带:欢迎到高级语言虚拟机群组讨论这类问题2011年10月12日 13:19
-
回复@FAvril:很简单:HotSpot VM对java.lang.String的字段排布是有硬性要求的;如果你要对String的字段个数、类型、名字等做修改,要在HotSpot VM上正常运行就必须连VM也相应的修改。
http://hg.openjdk.java.net/jdk6/jdk6/hotspot/file/dc40301aed45/src/share/vm/classfile/classFileParser.cpp
<< 3288行
http://hg.openjdk.java.net/jdk6/jdk6/hotspot/file/dc40301aed45/src/share/vm/classfile/javaClasses.hpp
<< 53行
http://hg.openjdk.java.net/jdk6/jdk6/hotspot/file/dc40301aed45/src/share/vm/classfile/javaClasses.cpp
<< 97行
fire_wang 写道那你去问问引用http://weibo.com/rednaxelafx
吧,虚拟机大牛
我也在这里的…2011年10月12日 13:12
-
引用只是新建一个java.lang的包,然后在里面新建一个String类,而且只有这一个类,名字跟java的String是一样的,内容跟它也一样,只是增加修改了一点。
没有使用什么命令,我用的是Eclipse开发,它里面的运行配置里可以进行配置
如果是这样那你能否试试将这个类的名字改改,换成另一个与String不冲突的名呢?2011年10月12日 11:20
-
引用xbootclasspath命令使虚拟机在调用原来的String类时先调用它
想知道你所说的打包jar是把整个jdk打包?还是说你修改的String类就是一个你自定义的类呢?还有就是你的命令是如何写的?2011年10月12日 11:07
-
引用改成private boolean barray; 则可正确运行
那你试试改成private boolean[] barray;可不可以2011年10月12日 10:53
-
private boolean barray[]
这数组应该是这样定义的吧
private boolean[] barray2011年10月12日 10:47
-
String类是final类型,不可继承,不知道是什么样复杂的需求让你需要修改String类?如果想修改String类,还是自己去写一个类似实现String功能的类,再在项目中使用即可,不过这样的工作量有点大哦。
2011年10月12日 10:44
-
这个类还是不要改动的好,越基础的类,改动风险非常大,像这个类是约定好了的,基本上是所以其他api的基础,不可以改的。
建议别改2011年10月12日 10:44
-
这个类还是不要改动的好,越基础的类,改动风险非常大,像这个类是约定好了的,基本上是所以其他api的基础,不可以改的。
2011年10月12日 10:38
相关推荐
- java.lang.ClassCastException: class java.lang.Integer cannot be cast to class java.lang.String
- java.lang.ClassCastException: java.lang.Long cannot be cast to java.lang.String
- java: 找不到符号 符号: 方法 of(java.lang.String,java.lang.String) - 问题解决
- mybatis中java.lang.String cannot be cast to java.lang.Integer报错
- java.lang.NumberFormatException For input string 错误及解决办法
相关推荐
`java.lang.ExceptionInInitializerError` 是Java编程语言中一种比较特殊的异常,通常在类的静态初始化过程中遇到问题时抛出。这个错误意味着在初始化类的静态变量或静态初始化块(static block)时发生了异常。这类...
Commons Lang是Apache软件基金会开发的一个Java工具包,它提供了许多实用的函数,扩展了Java标准库中关于字符串处理的功能。`StringUtils`类是这个工具包中的核心类之一,专门用于处理字符串的各种操作,包括但不...
import java.util.*; class MyException extends Exception{ String message; MyException(int age){ message=age+"年龄异常"; } public String getMessage(){ return message; } } class People{ ...
- `java.lang.String`:Java中的不可变字符串类,包含大量字符串操作方法。 5. **异常处理工具类**: - `java.util.concurrent.atomic.AtomicReference`:在多线程环境中安全地引用对象,支持原子操作。 - `java...
这个异常属于`java.lang.IndexOutOfBoundsException`类的子类,是Java运行时系统在检测到错误的数组索引时抛出的。 ### 数组的基本概念 数组在内存中占据连续的空间,每个元素通过索引来访问,索引通常是从0开始的...
在Java编程中,`IllegalArgumentException` 是一个常见的运行时异常,属于`RuntimeException`的子类。这个异常通常在方法接收到不合法或不适当的参数时抛出。当一个方法需要接收特定类型的参数,而传入的参数明显不...
- **初始阶段**:初期搭建Kubernetes需要手动下载所有必需的二进制文件、验证配置环境变量、安装各种网络存储插件等,这一过程耗时且容易出错。 - **运维挑战**:除了需要持续的手动维护(如升级Kubernetes版本等)...
2. 字符串处理:`java.lang.String`类是不可变的,提供了大量操作字符串的方法,如`substring()`、`indexOf()`、`replace()`等。`java.util.regex`包包含正则表达式相关类,如`Pattern`和`Matcher`,用于字符串的...
1. **基础类库**:包括`java.lang`包,这是所有Java程序的基础,包含了如`Object`、`String`、`System`等基本类型和工具类。`java.io`包提供了输入输出流,用于文件操作和数据传输。`java.util`包则包含集合框架、...
Java的`java.lang.String`类虽然已经提供了很多字符串操作的方法,但在实际开发中,`java.util.StringUtils`(来自Apache Commons Lang库)和`org.springframework.util.StringUtils`(Spring框架)等工具类提供了...
3. **`java.lang.String`**: 虽然`String`不是一个工具类,但它的众多静态和实例方法在处理字符串时非常实用。例如,`format()`用于格式化字符串,`contains()`检查子字符串是否存在,`substring()`截取子串,`...
- 当Java虚拟机或者类加载器尝试加载类定义,但找不到类定义时,会抛出此错误。这通常发生在类路径设置不正确或者所依赖的库没有正确地添加到项目中。 文档还提到了一些关于Java字符串操作的知识点: - 字符串是不...
1. **Java基础类库**:Java的基础类库包括`java.lang`包,它是所有Java程序的默认导入包,包含如`String`, `Object`, `System`等核心类。`String`类用于处理文本字符串,`Object`是所有Java类的父类,`System`类提供...
1. **核心类库**:如`java.lang`包下的基本类型包装类、Object类、String类等。 2. **集合框架**:`java.util`包中的List、Set、Map接口以及ArrayList、HashSet、HashMap等实现。 3. **输入/输出**:`java.io`包中的...
1. **核心类库**:如`java.lang`包,包含所有Java程序的基础类,如`Object`、`String`、`System`等。 2. **集合框架**:`java.util`包下的`ArrayList`、`HashMap`等,提供了数据存储和操作的工具。 3. **输入/输出**...
`java.lang.reflect` 包提供了`Class`、`Field`、`Method` 等类,`ClassUtil` 或类似的工具类可以封装这些反射操作,如创建对象、调用私有方法、修改私有属性等。 5. **Json**: JSON (JavaScript Object Notation) ...
6. **反射**:`java.lang.reflect`包提供了反射机制,允许在运行时动态获取类的信息并操作类的对象。 7. **异常处理**:`java.lang.Throwable`和其子类构成异常处理系统,提供错误报告和异常处理的机制。 8. **...
在Java标准库中,`java.lang.String`类已经提供了很多基本操作,但有时我们需要更复杂的功能,比如去除首尾空格、检查字符串是否为空、将驼峰命名转换为下划线命名等。String Util类通常会扩展这些功能,提供更加...
例如,`java.lang`是最基础的包,包含了所有Java程序都会用到的基本类型和常用类,如`String`、`Integer`和`Object`。`java.util`包提供了集合框架、日期时间、随机数生成等实用工具类。`java.io`包则用于处理输入...
位于java.lang包中,这个包中的类使用时不用导入 String类一旦初始化就不可以改变,而stringbuffer则可以。它用于封装内容可变的字符串。它可以使用tostring()转换成string字符串。 String x=”a”+4+”c”编译时...