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));
Reflectionを使用しても配列の長さを変更することはできないと思います。
これは、Javaチュートリアルからの参照です。
配列は、単一の型の値の固定数を保持するコンテナオブジェクトです。配列の長さは、配列の作成時に確立されます。作成後、その長さは固定されます。
http://docs.oracle.com/javase/tutorial/java/nutsandbolts/arrays.html
配列は固定長のデータ構造であるため、長さが変更されることはありません。それにもかかわらず、新しいメンバーを収容できるように、新しい固定長の新しい配列を作成することができます。
System.arrayCopy()
サイズが 2 の T 型の配列があるようなものです。
T[] t1 = 新しい T[2]
長さは2で固定です。したがって、2つ以上の要素を格納することはできません。しかし、新しい固定長、たとえば 5 の新しい配列を作成することで、
T[] t2 = 新しい T[5]
これで 5 つの要素を収容できます。次に、t1 の内容を t2 にコピーします。
System.arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
この例の場合、
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);
}
}
}