Zunächst wird die Anforderungsbeschreibung
Existierende eine Arraylist
Zweitens denken
Wir wissen, dass einmal in den Sammelklassen generischen Typen angegeben, nur die Art in der Sammlung verwendet. Aber wir können Reflektion verwenden, um die generischen gekreuzt zu inspizieren. Um zum Beispiel der Reflexion in der Erwerb Add Arraylist () Methode verwendet wird, dann rufen, wenn die Add-Methode, es die allgemeine Inspektion kreuzen. Decompile können wir dieses Phänomen sehen.
Im Anschluss an bestehenden Code, der die generischen verwendet, wenn Arraylist zu erstellen.
public class Test {
public static void main(String[] args) throws Exception {
ArrayList<Integer> array = new ArrayList<Integer>();
}
}
Decompile sieht die Datei mit der Klasse, werden Sie keine Zunahme der Generika in dieser Zeit schafft Arraylist finden.
Dies liegt daran, generische Kontrollen bei der Kompilierung durchgeführt, was bedeutet, dass die kompilierte Methode add (), und in der Tat nicht generisch Add angegeben hat () Methode ist die gleiche, sind keine generische Prüfung.
Daher wird durch die erworbene Arraylist Klasse Objektdatei Add reflektiert () -Methode, wenn die Aufruf Methode add () keine allgemeine Inspektion ist.
Drittens zu erreichen Nachfrage
Jetzt verwenden wir Reflexion diese Anforderung umzusetzen.
Code ist wie folgt:
public class Test {
public static void main(String[] args) throws Exception {
ArrayList<Integer> array = new ArrayList<Integer>();
array.add(18);
Class c = array.getClass();
Method m = c.getDeclaredMethod("add", Object.class);
m.invoke(array, "Hello");
System.out.println(array);
}
}
Die Testergebnisse sind wie folgt: