Maison > Java > javaDidacticiel > Réflexion : Comprendre l'essence des génériques de collection par la réflexion

Réflexion : Comprendre l'essence des génériques de collection par la réflexion

巴扎黑
Libérer: 2017-06-23 16:31:14
original
1512 Les gens l'ont consulté

Cet article est la suite des "Opérations de base de la méthode de réflexion Réflexion", utilisant la réflexion pour comprendre la nature des génériques dans les collections Java

1 Initialiser deux collections, une utilisant. Type générique, on n'utilise pas

1 ArrayList list1 = new ArrayList();2 ArrayList<String> list2 = new ArrayList<String>();
Copier après la connexion

2. Si un type défini est disponible, l'ajout du type int à list2 entraînera une erreur

1 list2.add("Hello");2 list2.add(20);   //报错
Copier après la connexion

3. Obtenez les types de classe des deux objets pour comparaison

1 Class c1 = list1.getClass();2 Class c2 = list2.getClass();3 System.out.println(c1 == c2);
Copier après la connexion

et renvoyez true via c1==c2, indiquant que les génériques de la collection sont dégénérés après la compilation, java Les génériques de la collection visent à empêcher une saisie incorrecte et ne sont valables que pendant la phase de compilation, ils seront invalides

4. Vérification : contourner la compilation via la réflexion de la méthode <.>

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 }
Copier après la connexion
5. Résultat de sortie

6. 🎜>

Voir le 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 }
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal