Bases de réflexion de Java
1. Qu'est-ce que la réflexion
Le mécanisme de réflexion est en état d'exécution, pour n'importe quelle classe , vous pouvez connaître toutes les méthodes et attributs de cette classe ; pour n'importe quel objet, vous pouvez appeler n'importe lequel de ses méthodes et attributs. Ces informations
2. Le rôle de la réflexion
1.Décompiler : .class–>java
2. , accédez aux propriétés, méthodes, méthodes de construction, etc. des objets via le mécanisme de réflexion
3 Implémentation spécifique de la réflexion
3. 🎜>
- java.lang.Class;
- java.lang.reflect.Constructor;
- java .lang.reflect .Field;
- java.lang.reflect.Method;
- java.lang.reflect.Modifier;
Class
objet
-
public final native Class<?> getClass();
-
package com.chb.reflectTest;public class Test { public static void main(String[] args) throws Exception { //第一种方式: Class<?> c1 = Class.forName("com.chb.reflectTest.Test"); //第二种方式:java中每个类都有class属性 Class<?> c2 = Test.class; //第三种方式:每个对象都与getClass()方法 Class<?> c3 = new Test().getClass(); } }
Class, utilisez-le pour créer un objet et appelez le constructeur sans paramètre via newInstance() pour créer le object, newInstance() Renvoie un objet Object :
Class<?> c1 = Class.forName("com.chb.reflectTest.Test");Object o1 = c1.newInstance();
- Obtenir les modifications
- puis transmettez toString() de java.long.reflect.Modifier pour imprimer les classes et les modifications d'attributs (publiques, statiques, finales, etc.).
- < de l'objet attribut ( Objet de champ) 🎜>
- Récupérez d'abord l'objet de modification via getModifiers() de l'attribut,
- Obtenir tous les attributs : via getDeclaedFields() de l'objet Class, renvoie un tableau Fielded* *.
- Grâce au getType()
Class<?> cString = Class.forName("java.lang.String"); //获取累的修饰和名称 System.out.print(Modifier.toString(cString.getModifiers())+" class " + cString.getSimpleName()+"{\n"); //获取所有属性 Field[] fields = cString.getDeclaredFields(); for (Field field : fields) { System.out.print("\t"); System.out.print( Modifier.toString(field.getModifiers())+" "//属性的修饰 + field.getType().getSimpleName()+" " + field.getName()+"\n"); } System.out.println("}");
Comparaison entre l'acquisition d'attributs traditionnels et l'acquisition par réflexion :
package com.chb.reflectTest;public class User { private String name; public String nickName; public User() {} public User(String name, String nickName) { this.name = name; this.nickName = nickName; } setter getter... }
Défini par réflexion La valeur de l'attribut distingue la plage de modification de l'attribut. Private ne peut pas être défini directement
Une erreur d'accès se produira. Il s'agit du mécanisme d'accès sécurisé de Java. L'erreur est signalée :package com.chb.reflectTest;import java.lang.reflect.Field;public class Test1 { public static void main(String[] args) throws Exception { //传统获取属性的值 //1、通过getter,setter User user1 = new User(); user1.setName("lisi"); System.out.println(user1.getName()); //2、直接调用属性 User user2 = new User(); user2.nickName = "癞皮狗"; System.out.println(user2.nickName); //========================================= //通过反射来设置,获取属性。 Class<User> c1 = (Class<User>) Class.forName("com.chb.reflectTest.User"); User user = c1.newInstance(); Field nickField = c1.getDeclaredField("nickName"); nickField.set(user, "123"); System.out.println(nickField.get(user)); Field nameFiled = c1.getDeclaredField("name"); //Exception in thread "main" java.lang.IllegalAccessException: Class com.chb.reflectTest.Test1 can not access a member of class com.chb.reflectTest.User with modifiers "private" nameFiled.setAccessible(true); nameFiled.set(user, "oup"); System.out.println(nameFiled.get(user)); } }
Nous utilisons une méthode pour le casser. Encapsulation de Java :
Exception in thread "main" java.lang.IllegalAccessException: Class com.chb.reflectTest.Test1 can not access a member of class com.chb.reflectTest. User with modifiers "private"
1 Qu'est-ce que la réflexion
nameFiled.setAccessible(true);
état d'exécution
. , pour n'importe quelle classe, vous pouvez connaître cette classe Toutes les méthodes et attributs de n'importe quel objet ; pour n'importe quel objet, vous pouvez appeler n'importe laquelle de ses méthodes et attributs. Cette- 2. , accédez aux propriétés, méthodes, méthodes de construction, etc. des objets via le mécanisme de réflexion
- 3 Implémentation spécifique de la réflexion
java.lang.Class;
java.lang.reflect.Constructor;
java .lang.reflect .Field;
java.lang.reflect.Method;
java.lang.reflect.Modifier;
3.2 Trois façons d'obtenir de grands objets Class
Puisque toute classe est une sous-classe d'Object et qu'il y a getClass dans Object, vous pouvez obtenir le
- Class
-public final native Class<?> getClass();
3.3 Création d'objets
package com.chb.reflectTest;public class Test { public static void main(String[] args) throws Exception { //第一种方式: Class<?> c1 = Class.forName("com.chb.reflectTest.Test"); //第二种方式:java中每个类都有class属性 Class<?> c2 = Test.class; //第三种方式:每个对象都与getClass()方法 Class<?> c3 = new Test().getClass(); } }
, utilisez-le pour créer un objet et appelez le constructeur sans paramètre via newInstance() pour créer le object, newInstance() Renvoie un objet Object :
3.4. Obtenir les données
Divisé en tous les attributs et attributs spécifiésClass<?> c1 = Class.forName("com.chb.reflectTest.Test");Object o1 = c1.newInstance();
3.4.1. 🎜>
Obtenir les modificationsRécupérez d'abord l'objet de modification via getModifiers() de l'attribut,
- puis transmettez toString() de java.long.reflect.Modifier pour imprimer les classes et les modifications d'attributs (publiques, statiques, finales, etc.).
Obtenir les attributs
Obtenir tous les attributs : via getDeclaedFields() de l'objet Class, renvoie un tableau Fielded* *.
Obtenir le type d'attribut :
通过属性对象(Field对象)的getType()
Class<?> cString = Class.forName("java.lang.String"); //获取累的修饰和名称 System.out.print(Modifier.toString(cString.getModifiers())+" class " + cString.getSimpleName()+"{\n"); //获取所有属性 Field[] fields = cString.getDeclaredFields(); for (Field field : fields) { System.out.print("\t"); System.out.print( Modifier.toString(field.getModifiers())+" "//属性的修饰 + field.getType().getSimpleName()+" " + field.getName()+"\n"); } System.out.println("}");
3.4.2 获取指定属性
创建测试对象:
注意: 我在Use类中定义了两个属性, 一个public ,一个private ,是为了下一个测试反射可以打破封装性
package com.chb.reflectTest;public class User { private String name; public String nickName; public User() {} public User(String name, String nickName) { this.name = name; this.nickName = nickName; } setter getter... }
传统属性的获取和通过反射获取对比:
package com.chb.reflectTest;import java.lang.reflect.Field;public class Test1 { public static void main(String[] args) throws Exception { //传统获取属性的值 //1、通过getter,setter User user1 = new User(); user1.setName("lisi"); System.out.println(user1.getName()); //2、直接调用属性 User user2 = new User(); user2.nickName = "癞皮狗"; System.out.println(user2.nickName); //========================================= //通过反射来设置,获取属性。 Class<User> c1 = (Class<User>) Class.forName("com.chb.reflectTest.User"); User user = c1.newInstance(); Field nickField = c1.getDeclaredField("nickName"); nickField.set(user, "123"); System.out.println(nickField.get(user)); Field nameFiled = c1.getDeclaredField("name"); //Exception in thread "main" java.lang.IllegalAccessException: Class com.chb.reflectTest.Test1 can not access a member of class com.chb.reflectTest.User with modifiers "private" nameFiled.setAccessible(true); nameFiled.set(user, "oup"); System.out.println(nameFiled.get(user)); } }
通过反射来设置属性的值, 区别属性的修饰范围, 私有的不可以直接设置
会出现访问错误, 也就是java的安全访问机制,报错:
Exception in thread "main" java.lang.IllegalAccessException: Class com.chb.reflectTest.Test1 can not access a member of class com.chb.reflectTest. User with modifiers "private"
我们通过一个方法·来打破java的封装性:
nameFiled.setAccessible(true);
以上就是java之反射基础的内容,更多相关内容请关注PHP中文网(www.php.cn)!

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

AI Hentai Generator
Générez AI Hentai gratuitement.

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)

Guide de la racine carrée en Java. Nous discutons ici du fonctionnement de Square Root en Java avec un exemple et son implémentation de code respectivement.

Guide du nombre parfait en Java. Nous discutons ici de la définition, comment vérifier le nombre parfait en Java ?, des exemples d'implémentation de code.

Guide du numéro Armstrong en Java. Nous discutons ici d'une introduction au numéro d'Armstrong en Java ainsi que d'une partie du code.

Guide du générateur de nombres aléatoires en Java. Nous discutons ici des fonctions en Java avec des exemples et de deux générateurs différents avec d'autres exemples.

Guide de Weka en Java. Nous discutons ici de l'introduction, de la façon d'utiliser Weka Java, du type de plate-forme et des avantages avec des exemples.

Guide du nombre de Smith en Java. Nous discutons ici de la définition, comment vérifier le numéro Smith en Java ? exemple avec implémentation de code.

Dans cet article, nous avons conservé les questions d'entretien Java Spring les plus posées avec leurs réponses détaillées. Pour que vous puissiez réussir l'interview.

Java 8 présente l'API Stream, fournissant un moyen puissant et expressif de traiter les collections de données. Cependant, une question courante lors de l'utilisation du flux est: comment se casser ou revenir d'une opération FOREAK? Les boucles traditionnelles permettent une interruption ou un retour précoce, mais la méthode Foreach de Stream ne prend pas directement en charge cette méthode. Cet article expliquera les raisons et explorera des méthodes alternatives pour la mise en œuvre de terminaison prématurée dans les systèmes de traitement de flux. Lire plus approfondie: Améliorations de l'API Java Stream Comprendre le flux Forach La méthode foreach est une opération terminale qui effectue une opération sur chaque élément du flux. Son intention de conception est
