0

我知道数组有一个固定大小的字段。我可以在反射中编辑它以增加它的价值。但是,我不认为这是我唯一需要通过反射来编辑数组大小的事情。我似乎无法在线找到数组类的来源[L

现在的进展:

Object[] foo = new Object[0];
Field field = foo.getClass().getField("size");

这导致一个NoSuchFieldException.

我试图破解 Java,类似于如何破解枚举。虽然我不知道所有东西都存放在哪里。我确实可以访问反射工厂: https ://www.niceideas.ch/roller2/badtrash/entry/java_create_enum_instances_dynamically

4

1 回答 1

1

如果不重新分配 Java 数组,就不可能(安全地)更改它的大小。

length数组的“字段”根本不是字段。从语法上讲,它是一种特殊情况。在实现级别,它是数组对象标头中的一个 32 位字。您不能使用反射更改单词中的值。如果你想出一些其他的方法来改变它,你会招来麻烦(JVM 崩溃),因为:

  • 长度是阻止你写超出数组末尾的原因,
  • 超出数组末尾的内存最有可能用于表示其他对象,并且
  • 各种低级的东西(例如 JIT 编译器和垃圾收集器)假设(正确!)数组对象的长度不能改变,并且可以将其缓存在本机代码变量或寄存器中。

[尝试使用反射] .... 导致字段未找到异常。

那是因为length不是一个字段;看上面。

我似乎无法在线找到静态数组类的来源[L

(这是 的类型名称long[])你不会找到它。它不存在。没有任何 Java 数组类型的 Java 源代码。

于 2020-01-20T04:59:17.440 回答