通过java.lang.Object检测数组

时间:2013-02-04 18:49:27

标签: java instrumentation

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

然而,我确实发现即使是数组类型也扩展了java.lang.Object,所以尽管修改Object类会不太理想,不仅仅是因为它会导致任何更改传播到所有子类,可能会允许我间接地向数组类添加一个额外的原始字段,顺便说一句,这是我想要实现的。

除了我提到的显而易见的警告,这会引起任何其他与平台相关的问题吗?

2 个答案:

答案 0 :(得分:4)

最简单的方法是将其替换为您选择的编译版本,而不是检测Object。假设这种方法有效,您可以对其进行检测以使其更加便携。

注意:我发现JVM不喜欢Object以获得其他方法(如果添加多个方法,则会出现奇怪的错误)

答案 1 :(得分:3)

您可能难以获得并设置该字段。

getfieldputfield指令的JVM规范中的描述(如果我理解正确的话)表明它们不会在数组上使用。引用,getfield

  

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

putfield

  

objectref的类不能是数组。

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