Java反射-编辑数组长度

Java反射-编辑数组长度,java,reflection,Java,Reflection,我想知道是否可以使用Java反射API更改类的整数数组的长度。如果是,如何进行?否;将创建具有固定长度的数组 您可以通过在较大的数组中使用副本修改字段的值(使用)来接近,只要您知道这样修改不会导致任何不一致 /* desired length */ final int desired = ...; /* the instance of the object containing the int[] field */ final Object inst = ...; /* the handle t

我想知道是否可以使用Java反射API更改类的整数数组的长度。如果是,如何进行?

否;将创建具有固定长度的数组

您可以通过在较大的数组中使用副本修改字段的值(使用)来接近,只要您知道这样修改不会导致任何不一致

/* desired length */
final int desired = ...;
/* the instance of the object containing the int[] field */
final Object inst = ...;
/* the handle to the int[] field */
final Field field = ...;
field.set(inst, Arrays.copyOf((int[]) field.get(inst), desired));

我认为即使使用反射,也不可能更改数组长度

 import java.lang.reflect.*;

 public class array1 {
  public static void main(String args[])
  {
     try {
        Class cls = Class.forName(
          "java.lang.String");
        Object arr = Array.newInstance(cls, 10);
        Array.set(arr, 5, "this is a test");
        String s = (String)Array.get(arr, 5);
        System.out.println(s);
     }
     catch (Throwable e) {
        System.err.println(e);
     }
  }
 }
这是java教程中的参考资料

数组是一个容器对象,它包含固定数量的单一类型的值。数组的长度是在创建数组时确定的。创建后,其长度是固定的


我猜java不允许您更改数组长度,但您可以使用反射在索引处设置值

 import java.lang.reflect.*;

 public class array1 {
  public static void main(String args[])
  {
     try {
        Class cls = Class.forName(
          "java.lang.String");
        Object arr = Array.newInstance(cls, 10);
        Array.set(arr, 5, "this is a test");
        String s = (String)Array.get(arr, 5);
        System.out.println(s);
     }
     catch (Throwable e) {
        System.err.println(e);
     }
  }
 }

数组是固定长度的数据结构,因此无法修改其长度。但是,可以使用新的固定长度创建一个新数组,这样它就可以使用

System.arrayCopy()

就像你有一个T型数组,大小为2

T[]t1=新的T[2]

它的长度固定为2。因此,它不能存储超过2个元素。但通过创建新的固定长度数组,例如5

T[]t2=新的T[5]

因此,它现在可以容纳5个元素。现在使用以下命令将t1的内容复制到t2

System.arraycopy(对象src、int-srcPos、对象dest、int-destPos、int 长度)

在本例中

System.arraycopy(t1,0,t2,0,t1.长度)

现在在新阵列中,您有了位置

从t1.length到t2.length-1


可供您使用。

无论您使用什么,都不可能更改数组的长度。我相信您最清楚,但如果您详细解释您的问题,也许有人可以为您找到一个不涉及入侵类内部数据的答案。谢谢您的回复。根据您告诉我的,我觉得我唯一的选择是使用字节码操纵器(如ASM)编辑数组声明。@user1606034如果您确实希望这样修改数组长度,为什么不重新编译源代码呢?在较低的级别上进行工作毫无意义。@user1606034如果出于任何原因需要使用字节码,则使用操作数堆栈的顶部字来确定大小。您可以修改大小,只需在
newarray
a之前插入,然后根据所需大小(例如)执行推送指令。我反映的是一个我没有编写的java应用程序,因此我没有源文件。是否有必要更改容器的长度\,为什么不使用java.lang.util中的动态容器,比如ArrayList,它在内部也是一个可调整大小的数组?请参阅。使用
Arrays.copyOf
比手动分配一个新数组并调用
System.arraycopy
.array.copyOf()在内部使用System.arraycopy()简单得多。所以我不太简单,但这可能是因为我已经习惯了使用System.arrayCopy()。谢谢。不能保证
Arrays.copyOf
在内部使用
System.arraycopy
,但在OpenJDK 7中使用。我认识到,因此我声明使用
copyOf
比使用
System手动分配和复制要简单得多。arraycopy
:P也许你应该看看Arrays.java的源代码。考虑到我链接到了
Arrays.java的OpenJDK 7代码,特别是
copyOf(int[],int)
——确认它使用了
System.arraycopy
,也许你应该阅读我的评论。我的观点是OpenJDK不是唯一的JDK实现。您不能确定地声明
数组。copyOf
在内部使用
System.arraycopy
,但它根本不是保证不变的。在美国,没有任何规定必须这样执行。其他API实现可以随意实现。