Heim > Java > javaLernprogramm > Reflexion: Das Wesen von Sammlungsgenerika durch Reflexion verstehen

Reflexion: Das Wesen von Sammlungsgenerika durch Reflexion verstehen

巴扎黑
Freigeben: 2017-06-23 16:31:14
Original
1512 Leute haben es durchsucht

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>();
Nach dem Login kopieren

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);   //报错
Nach dem Login kopieren

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);
Nach dem Login kopieren

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 }
Nach dem Login kopieren

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 }
Nach dem Login kopieren
Code anzeigen

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!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage