Maison  >  Article  >  Java  >  Tutoriel Java – Basic Strengthening_Reflection

Tutoriel Java – Basic Strengthening_Reflection

巴扎黑
巴扎黑original
2017-06-27 09:19:331425parcourir

JavaBean : Correspondance entre les tables de la base de données et les classes d'entités
1. S'il y a une table dans la base de données, il y aura une classe correspondant à la table
Base de données : Table Personne Java : Classe Preson
2 .Tableau Chaque colonne du tableau correspond à un champ (variable membre) en Java
3. Chaque ligne du tableau correspond à un objet en Java
Zhang San 18 hommes new Person (Zhang San 18 hommes Xiaohua 18 femelle new Person(小花 18 femelle) ;
Plusieurs objets peuvent être placés dans une collection ArrayList

JavaBean contient :
1. Variables membres privées
2. Méthodes publiques getter/setter
3. Méthode de construction de paramètres vides
4. Méthode toString
5. Implémenter l'interface de sérialisation

Trois façons d'obtenir des objets de fichier de classe :
1. Utilisez le méthode getClass()
Class getClass() dans la classe Object pour renvoyer la classe d'exécution de cet objet.
2. Utilisez l'attribut class name.class
Pour chaque type de données, type de données de base et type de données de référence, Java définira un attribut de classe pour cela
Class clazz = int.class
Class clazz = String.class
Class clazz = Person.class
3. Utilisez la méthode statique forName
dans la classe Class static Class forName(String className)
pour renvoyer la chaîne donnée. Objet de classe associé à la classe ou à l'interface nommée.

Remarque : L'objet fichier de classe de chaque classe ne sera généré qu'une seule fois et est unique.

Utilisez la technologie de réflexion pour obtenir le constructeur dans la classe et l'instancier
* public Person() { }
* personne publique (nom de chaîne, âge int, sexe de chaîne) {}
* personne privée (nom de chaîne, âge int) {}
*
* Étapes de mise en œuvre :
* 1 .Récupérez l'objet fichier de classe de la classe Person
* 2. Utilisez la méthode getConstructor dans l'objet fichier de classe pour obtenir la méthode de construction
* 3. Utilisez la méthode newInstrance dans le Constructeur pour instancier la méthode de construction


Un moyen rapide de créer un objet paramètre vide en utilisant la réflexion
* Prérequis d'utilisation :
* 1. Il doit y avoir un constructeur avec des paramètres vides dans la classe
* 2. Le modificateur du constructeur avec des paramètres vides ne peut pas être privé, il est recommandé d'utiliser public
*
* Il existe une méthode dans la classe Class
* T newInstance() pour créer une nouvelle instance de la classe représenté par cet objet Class.
*

Utilisez la technologie de réflexion pour obtenir des variables membres (champs) dans la classe, attribuer des valeurs aux variables membres et obtenir des valeurs
* private String name;
* private int age;
* public String sex;
*
* Étapes d'implémentation :
* 1. Récupérez l'objet fichier de classe de la classe Person
* 2. Utilisez la méthode getField dans la classe objet fichier pour obtenir la variable membre
* 3. Utilisez la méthode get/set dans Field pour obtenir la valeur de la variable membre, attribuez une valeur à la variable membre

 1  public static void main(String[] args) throws Exception { 2         //1.获取Person类的class文件对象 3         Class clazz = Class.forName("cn.itcast.demo02.javabean.Person"); 4         //2.使用class文件对象中的方法getField获取成员变量 5         /* 6          *  Field[] getFields()  获取类中所有可访问公共字段。 7          *  Field[] getDeclaredFields()  获取类中所有的声明字段,包含私有的。 8          */ 9         Field[] fields1 = clazz.getFields();10         for (Field field : fields1) {11             System.out.println(field);12         }13         System.out.println("------------------");14         Field[] fields2 = clazz.getDeclaredFields();15         for (Field field : fields2) {16             System.out.println(field);17         }18         System.out.println("------------------");19         20         /*21          * Field getField(String name)  获取类中指定公共成员字段。22          * Field getDeclaredField(String name)  获取类中指定的声明字段,包含私有的。23          * 参数:24          *     String name:字段的名字25          */26         //public String sex;27         Field sexField = clazz.getField("sex");28         System.out.println(sexField);29         //private String name;30         Field nameField = clazz.getDeclaredField("name");31         System.out.println(nameField);32         //private int age;33         Field ageField = clazz.getDeclaredField("age");34         System.out.println(ageField);35         36         /*37          * 3.使用Field中的方法get/set获取成员变量值,给成员变量赋值38          * Object get(Object obj) 返回指定对象上此 Field 表示的字段的值。 
39          * void set(Object obj, Object value) 将指定对象变量上此 Field 对象表示的字段设置为指定的新值。40          * 参数:41          *     Object obj:要设置值/获取的值的对象,可以使用反射快速创建42          *     Object value:给成员变量设置的实际值43          * 返回值:44          *     Object:获取成员变量的返回值    
45          */46         //使用反射创建对象47         Object obj = clazz.newInstance();48         49         //public String sex;50         //get(obj);-->getSex();51         Object sexValue = sexField.get(obj);52         System.out.println(sexValue);//默认值 null53         54         /*55          * private String name;56          * 私有的属性无法直接使用,必须先取消Java的权限检查(暴力反射)57          */58         nameField.setAccessible(true);59         Object nameValue = nameField.get(obj);60         System.out.println(nameValue);//默认值 null61         62         //private int age;63         ageField.setAccessible(true);64         Object ageValue = ageField.get(obj);65         System.out.println(ageValue);//默认值 066         System.out.println("------------------");67         /*68          * 设置成员变量的值69          */70         //public String sex;71         sexField.set(obj, "妖");72         //获取值73         sexValue = sexField.get(obj);74         System.out.println(sexValue);//妖75         76         //private String name;77         nameField.set(obj, "泰国美女");78         //获取值79         nameValue = nameField.get(obj);80         System.out.println(nameValue);//泰国美女81         82         //private int age;83         ageField.set(obj, 18);84         //获取值85         ageValue = ageField.get(obj);86         System.out.println(ageValue);//1887         System.out.println(obj);//Person [name=泰国美女, age=18, sex=妖]88     }
Utiliser technologie de réflexion pour obtenir la méthode membre dans la classe et exécuter

* public String getName()
* public void setName(String name)
* private void method()
*
* Étapes d'implémentation :
* 1. Obtenez l'objet fichier de classe de la classe Personne
* 2. Utilisez la méthode getMethod dans l'objet fichier de classe pour obtenir la méthode membre
* 3. Utilisez la méthode Invocation dans le Méthode pour exécuter la méthode obtenue
*
* Méthode dans la classe Method : getName, récupère la méthode Name
* String getName() Renvoie le nom de la méthode représenté par cet objet Method sous forme de String.

 1 public static void main(String[] args) throws Exception { 2         //1.获取Person类的class文件对象 3         Class clazz = Class.forName("cn.itcast.demo02.javabean.Person"); 4         //2.使用class文件对象中的方法getMethod获取成员方法 5         /* 6          * Method[] getMethods() 获取类中所有的公共方法,包含继承父类的 7          * Method[] getDeclaredMethods() 包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法。 
 8          */ 9         Method[] methods1 = clazz.getMethods();10         for (Method method : methods1) {11             System.out.println(method);12         }13         System.out.println("----------------------");14         Method[] methods2 = clazz.getDeclaredMethods();15         for (Method method : methods2) {16             System.out.println(method.getName());17         }18         System.out.println("----------------------");19         /*20          *  Method getMethod(String name, Class<?>... parameterTypes) 获取类中指定公共成员方法。21          *  Method getDeclaredMethod(String name, Class<?>... parameterTypes) 获取类中指定的成员方法,包含私有的.22          *  参数:23          *      String name:方法的字符串名称24          *      Class<?>... parameterTypes:方法参数列表的class对象    
25          */26         //public String getName()27         Method getNameMethod = clazz.getMethod("getName");28         System.out.println(getNameMethod);29         30         //public void setName(String name)31         Method setNameMethod = clazz.getMethod("setName", String.class);32         System.out.println(setNameMethod);33         34         //private void method()35         Method privateMethod = clazz.getDeclaredMethod("method");36         System.out.println(privateMethod);37         38         /*39          * 3.使用Method中的方法invoke执行获取到的方法40          * Object invoke(Object obj, Object... args) 
41          * 参数:42          *     Object obj:要执行的方法的所属对象43          *     Object... args:执行方法,传递的实际参数44          * 返回值:45          *     Object:方法的返回值46          *     如果方法没有返回值,Object的值为null47          */48         Object obj = clazz.newInstance();49         50         //public String getName()51         Object v1 = getNameMethod.invoke(obj);52         System.out.println(v1);//成员变量 name的默认值:null53         54         //public void setName(String name)55         Object v2 = setNameMethod.invoke(obj, "楼上老宋");56         System.out.println(v2);57         58         v1 = getNameMethod.invoke(obj);59         System.out.println(v1);//成员变量 name的值:楼上老宋60         61         /*62          * private void method()63          * 使用暴力反射,取消Java的权限检查64          */65         privateMethod.setAccessible(true);66         privateMethod.invoke(obj);//私有方法67         68         System.out.println("-------------");69         //获取返回值为数组的方法70         Method arrMethod = clazz.getMethod("methodArr");71         Object v3 = arrMethod.invoke(obj);72         int[] arr = (int[]) v3;73         System.out.println(v3);74         System.out.println(arr);75         for (int i : arr) {76             System.out.println(i);77         }78     }
Cas complet de réflexion :

* Obtenez des objets JavaBean grâce à la technologie de réflexion et injectez (attribuez) des valeurs aux variables membres JavaBean
*
* Étapes d'implémentation :
* 1. Créez un JavaBean (classe utilisateur)
* 2. Créez un fichier de configuration data.properties et configurez les valeurs réelles des variables membres
* 3. Utilisez le IO+ Collection de propriétés à lire Récupérez le fichier de configuration et enregistrez les données du fichier dans la collection
* 4. Utilisez la technologie de réflexion pour créer un objet JavaBean
* 5. Parcourez la collection Propriétés
* 6. Utilisez le Clé de collection de propriétés pour épisser la méthode setXXX
* 7. Utilisez la technologie de réflexion pour obtenir la méthode setXXX
* 8. Utilisez la technologie de réflexion pour exécuter la méthode setXXX et injecter des valeurs dans les variables membres

 1 public static void main(String[] args) throws Exception { 2         //3.使用IO+Properties集合,读取配置文件,把文件中的数据保存到集合中 3         Properties prop = new Properties(); 4         prop.load(new FileReader("data.properties")); 5         //4.使用反射技术创建JavaBean对象 6         Class clazz = Class.forName("cn.itcast.demo02.javabean.User"); 7         Object obj = clazz.newInstance(); 8         //5.遍历Properties集合 9         Set<String> set = prop.stringPropertyNames();10         for (String key : set) {11             /*12              * 6.使用Properties集合key拼接setXXX方法13              * 类中的set方法:14              *     setId,setUsername,setPassword15              * 集合的key:16              *     id,username,password17              * 拼接的过程:18              *     1.固定的字符串:"set"19              *     2.获取key的首字母,变成大写20              *     3.获取key的其它字母21              */22             String methodName = "set"+key.substring(0, 1).toUpperCase()+key.substring(1);23             //System.out.println(methodName);24             25             //7.使用反射技术获取setXXX方法26             Method setMethod = clazz.getMethod(methodName, String.class);27             //8.使用反射技术执行setXXX方法,给成员变量注入值(集合的value值)28             setMethod.invoke(obj, prop.get(key));29             30             /*31              * 扩展:拼接getXXX方法32              */33             String getMethodName = "get"+key.substring(0, 1).toUpperCase()+key.substring(1);34             Method getMethod = clazz.getMethod(getMethodName);35             Object value = getMethod.invoke(obj);36             System.out.println(value);37         }38         System.out.println(obj);39     }
Utiliser la technologie de réflexion pour obtenir l'interface

* Class[] getInterfaces() détermine l'interface implémentée par la classe ou l'interface représentée par cet objet

 1  public static void main(String[] args) throws Exception { 2         //获取接口实现类的class文件对象 3         Class clazz = Class.forName("cn.itcast.demo06.reflect.AandBImpl"); 4         //使用Class中的方法getInterfaces获取实现的实现的接口 5         Class[] clazzs = clazz.getInterfaces(); 6         for (Class c : clazzs) { 7             System.out.println(c);//接口 8             //使用接口class文件对象,创建实现类对象,调用实现类中的方法 9             Object obj = clazz.newInstance();10             Method method = c.getMethod("a");11             method.invoke(obj);12         }13     }

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!

Déclaration:
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