Maison >Java >javaDidacticiel >Bases de réflexion de Java
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 cecea0c57dfb9347ba4c9e9c5b1aa069 dynamiquement et la méthode d'appel dynamique de l'objet sont appelées celles de Java. mécanisme de 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
Class
objet
-
public final native Class6b3d0130bba23ae47fe2b8e8cddf0195 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(); } }3.3 Création d'objets Après avoir obtenu l'objet
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();3.4. Obtenir les données Divisé en tous les attributs et attributs spécifiés 3.4.1. 🎜>
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("}");Créer un objet de test : Remarque : j'ai défini deux attributs dans le La classe d'utilisation, une publique, une privée, est pour le prochain test que la réflexion peut briser l'encapsulation
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... }
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);Le mécanisme de réflexion est dans l'
0bce45d4f0b77aa4d8c3d3f613d66865 qui appellent l'objet sont appelés le mécanisme de réflexion de Java. 2. Le rôle de la réflexion
1.Décompiler : .class–>javajava.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
- Class
-public final native Class6b3d0130bba23ae47fe2b8e8cddf0195 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(); } }Class
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();
Récupérez d'abord l'objet de modification via getModifiers() de l'attribut,
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("}");
创建测试对象:
注意: 我在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)!