1、在反射机制中,把类中的成员变量使用类Field表示;
2、通过Class类中提供的方法获取成员变量:
(1)返回一个成员变量
public Field getField(String name) 获取指定的 public修饰的变量 public Field getDeclaredField(String name) 获取指定的任意变量
(2)返回多个成员变量
public Field[] getFields() 获取所有public 修饰的变量 public Field[] getDeclaredFields() 获取所有的 变量 (包含私有)
(3)获取成员变量代码演示
1 package cn.gzdlh_01_Reflect; 2 3 import java.lang.reflect.Field; 4 5 public class FieldDemo { 6 public static void main(String[] args) throws ClassNotFoundException, 7 NoSuchFieldException, SecurityException { 8 // 获取Class对象 9 Class c = Class.forName("cn.gzdlh_01_Reflect.Person"); 10 11 // 获取成员变量 12 // 多个变量 13 // Field[] fields = c.getFields(); 14 Field[] fields = c.getDeclaredFields(); 15 for (Field field : fields) { 16 System.out.println(field); 17 } 18 System.out.println("-----------------"); 19 // 一个变量 20 // public int age; 21 Field ageField = c.getField("age"); 22 System.out.println(ageField); 23 24 // private String address 25 Field addressField = c.getDeclaredField("address"); 26 System.out.println(addressField); 27 } 28 }
3、通过反射,创建对象,获取指定的成员变量,进行赋值与获取值操作
(1)获取成员变量,步骤如下:
①获取Class对象;
②获取构造方法;
③通过构造方法,创建对象;
④获取指定的成员变量(私有成员变量,通过setAccessible(boolean flag)方法暴力访问);
⑤通过方法,给指定对象的指定成员变量赋值或者获取值。
public void set(Object obj, Object value) 在指定对象obj中,将此 Field 对象表示的成员变量设置为指定的新值 public Object get(Object obj) 返回指定对象obj中,此 Field 对象表示的成员变量的值
(2)代码演示
1 package cn.gzdlh_01_Reflect; 2 3 import java.lang.reflect.Constructor; 4 import java.lang.reflect.Field; 5 import java.lang.reflect.InvocationTargetException; 6 7 public class FieldDemo2 { 8 public static void main(String[] args) throws ClassNotFoundException, 9 NoSuchMethodException, SecurityException, InstantiationException, 10 IllegalAccessException, IllegalArgumentException, 11 InvocationTargetException, NoSuchFieldException { 12 // 1,获取Class对象 13 Class c = Class.forName("cn.gzdlh_01_Reflect.Person"); 14 // 2,获取构造方法 15 // public Person(String name) 16 Constructor con = c.getConstructor(String.class); 17 // 3,通过构造方法,创建对象 18 Object obj = con.newInstance("gzdlh"); 19 // 4,获取指定的成员变量 20 // public String name; 21 Field nameField = c.getField("name"); 22 // public int age; 23 Field ageField = c.getField("age"); 24 // private String address; 25 Field addressField = c.getDeclaredField("address"); 26 addressField.setAccessible(true); // 取消 Java 语言访问检查 27 28 // 5,通过方法,给指定对象的指定成员变量赋值或者获取值 29 System.out.println("name = " + nameField.get(obj)); 30 System.out.println("age = " + ageField.get(obj)); 31 System.out.println("address = " + addressField.get(obj)); 32 33 // 赋值 34 ageField.set(obj, 23); 35 addressField.set(obj, "广州信息港"); 36 37 System.out.println("------------------------"); 38 System.out.println("name = " + nameField.get(obj)); 39 System.out.println("age = " + ageField.get(obj)); 40 System.out.println("address = " + addressField.get(obj)); 41 } 42 }