Dieser Artikel ist eine Fortsetzung des obigen Artikels „Grundlegende Operationen der Reflexionsmethode“ und verwendet Reflexion, um die Natur von Generika in Java-Sammlungen zu verstehen.
1 Initialisieren Sie zwei Sammlungen, eine mit generics Typ, man verwendet nicht
1 ArrayList list1 = new ArrayList();2 ArrayList<String> list2 = new ArrayList<String>();
2. Wenn ein definierter Typ verfügbar ist, führt das Hinzufügen des int-Typs zu list2 zu einem Fehler
1 list2.add("Hello");2 list2.add(20); //报错
3. Rufen Sie die Klassentypen der beiden Objekte zum Vergleich ab
1 Class c1 = list1.getClass();2 Class c2 = list2.getClass();3 System.out.println(c1 == c2);
und geben Sie über c1==c2 true zurück, was darauf hinweist, dass es sich um die Generika der Sammlung handelt sind nach der Kompilierung degeneriert, Java Die Generika in der Sammlung sollen falsche Eingaben verhindern und sind nur während der Kompilierungsphase gültig. Wenn Sie die Kompilierung umgehen, sind sie ungültig
4. Überprüfung: Kompilierung durch Methodenreflexion umgehen
1 try {2 Method m = c2.getMethod("add", Object.class);3 m.invoke(list2,20);4 System.out.println(list2);5 } catch (Exception e) {6 e.printStackTrace();7 }
5. Ausgabeergebnis
6. Vollständiger Code
1 package com.format.test; 2 3 import java.lang.reflect.Method; 4 import java.util.ArrayList; 5 6 /** 7 * Created by Format on 2017/6/4. 8 */ 9 public class Test2 {10 public static void main(String[] args) {11 ArrayList list1 = new ArrayList();12 ArrayList<String> list2 = new ArrayList<String>();13 list2.add("Hello");14 // list2.add(20); //报错15 Class c1 = list1.getClass();16 Class c2 = list2.getClass();17 System.out.println(c1 == c2);18 /**19 * 反射操作都是编译之后的操作20 * c1==c2结果返回true,说明编译之后集合的泛型是去泛型化的21 * java中集合的泛型是为了防止错误输入的,只在编译阶段有效,绕过编译就无效了22 * 验证:通过方法的反射来绕过编译23 */24 try {25 Method m = c2.getMethod("add", Object.class);26 m.invoke(list2,20);27 System.out.println(list2);28 } catch (Exception e) {29 e.printStackTrace();30 }31 }32 }
Das obige ist der detaillierte Inhalt vonReflexion: Das Wesen von Sammlungsgenerika durch Reflexion verstehen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!