Tutoriel Java – Basic Strengthening_Reflection
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 }
* 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 }
* 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 }
* 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!

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

Video Face Swap
Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds





Le mécanisme de réflexion permet aux programmes d'obtenir et de modifier des informations de classe au moment de l'exécution. Il peut être utilisé pour implémenter la réflexion d'interfaces et de classes abstraites : Réflexion d'interface : obtenez l'objet de réflexion d'interface via Class.forName() et accédez à ses métadonnées (nom, méthode et champ) . Réflexion de classes abstraites : Semblable aux interfaces, vous pouvez obtenir l'objet de réflexion d'une classe abstraite et accéder à ses métadonnées et méthodes non abstraites. Cas pratique : Le mécanisme de réflexion peut être utilisé pour implémenter des proxys dynamiques, en interceptant les appels aux méthodes d'interface au moment de l'exécution en créant dynamiquement des classes proxy.

Vous pouvez utiliser la réflexion pour accéder aux champs et méthodes privés en langage Go : Pour accéder aux champs privés : obtenez la valeur de réflexion de la valeur via Reflect.ValueOf(), puis utilisez FieldByName() pour obtenir la valeur de réflexion du champ, et appelez le Méthode String() pour imprimer la valeur du champ. Appelez une méthode privée : obtenez également la valeur de réflexion de la valeur via Reflect.ValueOf(), puis utilisez MethodByName() pour obtenir la valeur de réflexion de la méthode, et enfin appelez la méthode Call() pour exécuter la méthode. Cas pratique : modifiez les valeurs des champs privés et appelez des méthodes privées par réflexion pour obtenir le contrôle des objets et la couverture des tests unitaires.

Reflection fournit des fonctionnalités de vérification et de modification de type dans Go, mais il présente des risques de sécurité, notamment l'exécution de code arbitraire, la falsification de type et la fuite de données. Les meilleures pratiques incluent la limitation des autorisations et des opérations réfléchissantes, l'utilisation de listes blanches ou de listes noires, la validation des entrées et l'utilisation d'outils de sécurité. En pratique, la réflexion peut être utilisée en toute sécurité pour inspecter les informations de type.

La réflexion du langage Go vous permet de manipuler des valeurs de variables au moment de l'exécution, notamment en modifiant les valeurs booléennes, les entiers, les nombres à virgule flottante et les chaînes. En obtenant la valeur d'une variable, vous pouvez appeler les méthodes SetBool, SetInt, SetFloat et SetString pour la modifier. Par exemple, vous pouvez analyser une chaîne JSON dans une structure, puis utiliser la réflexion pour modifier les valeurs des champs de la structure. Il convient de noter que l'opération de réflexion est lente et que les champs non modifiables ne peuvent pas être modifiés. Lors de la modification de la valeur du champ de structure, les champs associés peuvent ne pas être automatiquement mis à jour.

La fonctionnalité de réflexion du langage Go permet à un programme d'inspecter et de modifier la structure d'un type au moment de l'exécution. En utilisant Type, Value et Reflect.Kind, nous pouvons obtenir les informations de type, les valeurs de champ et les méthodes de l'objet, et nous pouvons également créer et modifier des objets. Les méthodes d'opération spécifiques incluent : la vérification du type (TypeOf()), l'obtention de la valeur du champ (ValueOf(), FieldByName()), la modification de la valeur du champ (Set()) et la création d'un objet (New()).

En utilisant la réflexion, Go permet la création de nouveaux types. 1. Utilisez Reflect.TypeOf() pour obtenir la valeur Reflect.Type d'un type existant ; 2. Utilisez Reflect.New() pour créer une valeur de pointeur d'un nouveau type ; . Via *Ptr.Elem( ) pour accéder à la valeur réelle ; 4. La réflexion peut également créer dynamiquement de nouveaux types basés sur des chaînes, qui sont utilisées pour créer des programmes flexibles et dynamiques.

Réponse : Oui, la réflexion en langage Go peut implémenter une programmation orientée aspect. Description détaillée : Reflection permet à un programme de modifier et d'inspecter ses propres types et valeurs au moment de l'exécution. Grâce à la réflexion, nous pouvons créer des aspects globaux pour le code, qui sont déclenchés avant et après l'exécution de la fonction. Cela nous permet d'ajouter facilement des fonctionnalités telles que la journalisation sans modifier le code existant. Reflection offre les avantages du découplage du code, de l'évolutivité et du contrôle flexible, améliorant ainsi la maintenabilité et la réutilisation des applications.

Le mécanisme de réflexion est utilisé en Java pour implémenter la surcharge de méthode : Obtenir des méthodes par réflexion : utilisez la méthode getMethod() pour obtenir l'objet méthode et spécifiez le nom de la méthode et le type de paramètre. Méthode d’appel : utilisez la méthode Invoke() pour appeler la méthode, en spécifiant l’objet appelant et les valeurs des paramètres.
