Ich habe mich gefragt, ob es möglich ist, die Länge eines Integer-Arrays einer Klasse mithilfe der Java Reflection API zu ändern. Wenn ja, wie?
Antworten
Zu viele Anzeigen?Nein, es wird ein Array mit einer festen Länge erstellt.
Was Sie kann nahe kommen, indem sie den Wert des Feldes mit einer コピー in größer Array (mit Arrays.copyOf
), sofern Sie wissen, dass eine solche Änderung nicht zu Inkonsistenzen führen wird.
/* 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));
Ich glaube nicht, dass es möglich ist, die Array-Länge auch mit Reflection zu ändern.
Dies ist eine Referenz aus dem Java-Tutorial.
Ein Array ist ein Containerobjekt, das eine feste Anzahl von Werten eines einzigen Typs enthält. Die Länge eines Arrays wird bei der Erstellung des Arrays festgelegt. Nach der Erstellung ist die Länge fest.
http://docs.oracle.com/javase/tutorial/java/nutsandbolts/arrays.html
Bei einem Array handelt es sich um eine Datenstruktur mit fester Länge, so dass ihre Länge nicht geändert werden kann. Nichtsdestotrotz kann man ein neues Array mit einer neuen festen Länge erstellen, so dass es neue Mitglieder aufnehmen kann, indem man
System.arrayCopy()
Es ist, als ob Sie ein Array vom Typ T mit der Größe 2 haben,
T[] t1 = new T[2]
und seine Länge ist mit 2 festgelegt. Es kann also nicht mehr als 2 Elemente speichern. Aber durch das Erstellen eines neuen Arrays mit einer neuen festen Länge, sagen wir 5,
T[] t2 = new T[5]
Es können also jetzt 5 Elemente untergebracht werden. Kopieren Sie nun den Inhalt von t1 nach t2 mit
System.arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
in diesem Fall des Beispiels,
System.arraycopy(t1, 0, t2, 0, t1.length)
In dem neuen Array haben Sie nun die Position
von t1.length bis t2.length-1
ist für Sie verfügbar.
Ich schätze, Java wird nicht zulassen, dass Sie Array Länge ändern, aber ja können Sie Wert auf Index mit Reflexion festgelegt.
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);
}
}
}