7

我目前正在开发一个平台,该平台通过 ASM 库大量使用动态字节码修改例程。除了数组类之外,我已经能够成功地检测所有必需的系统类。(即 String[]、int[] 等)这是因为数组类本身就是一个动态类型,因此据我所知,rt.jar 中实际上没有类文件可以检测。

但是,我确实想到,即使数组类型扩展了 java.lang.Object 所以虽然修改 Object 类并不理想,尤其是因为它会导致任何更改传播到所有子类,它可能允许我间接向数组类添加了一个额外的原始字段,顺便说一句,这就是我想要实现的全部目标。

除了我提到的明显警告之外,这会导致任何其他与平台相关的问题吗?

4

2 回答 2

4

最简单的做法是用您选择的编译版本替换它,而不是检测 Object。假设这可行,您可以对其进行检测以使其更便携。

注意:我发现 JVM 不喜欢 Object 有额外的方法(如果你添加了多个方法,你会得到奇怪的错误)

于 2013-02-04T19:35:24.200 回答
3

您可能难以获取和设置字段。

JVM 规范中对getfieldandputfield指令的描述(如果我理解正确的话)声明它们不能用于数组。引用,对于getfield

objectref 的类型不能是数组类型。

putfield

objectref 的类不能是数组。

但是,“如果在运行时不满足指令描述中的某些约束(“必须”或“不得”),则 Java 虚拟机的行为是未定义的,因此它可能会正常工作。

于 2013-02-04T19:31:41.810 回答