我想知道是否可以使用 Java Reflection API 更改类的整数数组的长度。如果是这样,怎么做?
4 回答
没有; 创建一个固定长度的数组。
您可以做的是通过使用较大数组中的副本(使用)修改字段的值来接近,只要您知道这样的修改不会导致任何不一致。Arrays.copyOf
/* 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));
我认为即使使用反射也无法更改数组长度。
这是java教程的参考。
数组是一个容器对象,它包含固定数量的单一类型的值。数组的长度是在创建数组时确定的。创建后,它的长度是固定的。
http://docs.oracle.com/javase/tutorial/java/nutsandbolts/arrays.html
数组是一个固定长度的数据结构,所以它的长度是不可能被修改的。尽管如此,人们可以创建一个具有新固定长度的新数组,这样它可以容纳新成员使用
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.length)
现在在新数组中,你有位置
从 t1.length 到 t2.length-1
可供您使用。
我猜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);
}
}
}