这两天在做动态污点传播(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
分享到:
相关推荐
Spring Boot 枚举使用的坑整理是指在使用 Spring Boot 枚举时可能出现的一些问题和解决方法的总结。枚举类型是一种特殊的数据类型,它具有固定的值,且这些值不会被修改。在 Java 中,枚举类型可以使用 enum 关键字...
Java API(Application Programming Interface)是Java编程语言的核心组成部分,它为开发者提供了丰富的类库和接口,使得开发人员能够构建各种...在实际开发中,遇到问题时,查阅Java API文档通常能快速找到解决方案。
但运行时抛出了`SecurityException`,原因在于`Test`类是由不同的ClassLoader加载的,而不是启动类加载器,因此无法访问由启动类加载器加载的`java.lang.String`类的私有构造函数。 在Java中,只有由同一个...
- **动态**:运行时可以加载和卸载类,增强了灵活性。 **1.3 安装Sun公司的SDK** - **三种平台**: - **JavaSE (J2SE)**:标准版,适用于桌面应用程序。 - **JavaEE (J2EE)**:企业版,支持服务器端应用开发。 ...
10. **反射与动态代理**:`java.lang.reflect`包提供反射机制,允许在运行时检查类和对象的属性,`java.lang.invoke`包则提供了动态代理的支持。 11. **泛型**:Java 5引入的泛型可以增强类型安全,减少强制类型...
Java的rt.jar是Java运行时库的核心组成部分,它包含了Java标准版(JRE)的类库,涵盖了Java语言的基础类,如Object、String、ArrayList、Thread等,以及I/O流、网络编程、反射、异常处理等多个核心功能的实现。...
例如,`java.lang.String`类用于表示不可变的字符序列,而`java.util.ArrayList`接口提供了动态数组功能。 3. **方法和构造器**:每个方法和构造器都列出其参数、返回值、异常和简要描述,帮助开发者了解如何使用。...
JAVA 中有许多常用的类,每个类都有其特定的方法,本文将对 java.lang.Object 类、String 类和 StringBuffer 类的常用方法进行讲解。 一、java.lang.Object类 java.lang.Object 类是 JAVA 中所有类的父类,它提供...
在 Java 中,equals() 方法是 Object 类中的一个方法,所有的类都是继承自 java.lang.Object 类的,因此如果没有对该方法进行覆盖的话,调用该方法是没有意义的。只有在对 equals() 方法进行重写的情况下,才能正确...
System.out.println(java.lang.String.class.getClassLoader()); // 输出 null ``` 2. **扩展类加载器(Extension Class Loader)**:该类加载器负责加载位于 `java.ext.dirs` 系统属性指定目录下的 jar 包中的...
另一种方式是通过继承`java.lang.Thread`类并重写`run()`方法。 5. **Applet生命周期管理:** - Applet具有特定的生命周期方法,如`init()`、`start()`、`stop()`和`destroy()`。`init()`方法是Applet加载时首先...
* 43B:类中定义了 hashCode() 方法,但是没有重写 java.lang.Object 中的 hashCode() 方法 * 44C:类中定义了 tostring() 方法,但是没有重写 java.lang.Object 中的 tostring() 方法 * 45C:某些方法名只有大小写...
例如,`java.lang.String`是处理字符串的类,`java.util.ArrayList`用于动态数组操作,`java.io.File`则涉及文件操作。 3. **接口(Interfaces)**:接口是Java中定义行为规范的抽象类型,它包含一组抽象方法。比如...
在这个"495.493.JAVA基础教程_枚举类与注解-每天一考(495)"教程中,我们将深入探讨两个重要的Java特性:枚举类(Enum)和注解(Annotation)。 首先,让我们来看看枚举类。在Java中,枚举是一种特殊的类,用于定义...
例如,`java.lang`包中的`String`类用于处理字符串,`System`类提供了与操作系统交互的方法;`java.io`包包含流操作,如`FileInputStream`和`OutputStream`;`java.util`包中的`ArrayList`和`HashMap`是常用的数据...
- `java.lang.Integer#valueOf(String)`:以及`Boolean`、`Byte`、`Character`、`Short`、`Long`、`Float`和`Double`的相似方法,用于将字符串转换为相应的包装类型。 - `java.lang.Class#forName()`:加载类的方法...
Java注解(Annotation)是Java 5引入的一种元数据(metadata)机制,用于向代码中添加附加信息,这些信息可以被编译器或者运行时环境利用,进行代码分析、生成文档或者实现某些框架功能。Java注解的基本语法和使用方法,...
在Java开发中,我们经常会遇到从集合类List、Map中取出数据转换为String的问题,但如果处理不好,经常会遇到空指针异常java.lang.NullPointerException。因此,了解Java String转换时为null的解决方法变得非常重要。...
在Java编程语言中,动态类加载机制是一种强大的特性,它允许程序在运行时加载、实例化和执行未在编译时硬编码的类。这种能力是通过Java的反射API实现的,它为开发者提供了深入洞察和操作Java对象的能力。本文将深入...
创建自定义类加载器需要继承`java.lang.ClassLoader`,并重写`findClass()`方法。在该方法中,可以读取类的字节码,然后通过`defineClass()`方法将字节码转换为`Class`对象。以下是一个简单的自定义类加载器示例: ...