1. 程式人生 > >【反射之Field】獲取字段

【反射之Field】獲取字段

super setw print invoke return pri protect bsp 必須

getFields()、getDeclaredFields()、getField() 和 getDeclaredField()的用法

 1 package reflect.field;
 2 
 3 import java.lang.reflect.Constructor;
 4 import java.lang.reflect.Field;
 5 import java.lang.reflect.InvocationTargetException;
 6 import java.lang.reflect.Method;
 7 
 8 public class FieldMethod {
9 10 public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, SecurityException, NoSuchMethodException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { 11 Class<?> personClass = Class.forName("reflect.Person");
12 13 Constructor<?> constructor = personClass.getDeclaredConstructor(String.class, int.class, double.class, String.class); 14 Object p = constructor.newInstance("周娟娟", 23, 80, "14計科1班"); 15 System.out.println(p.toString()); 16 17 18 // 該方法只能獲取到公有的字段(屬性)
19 Field[] fields = personClass.getFields(); 20 for (Field field : fields) { 21 // System.out.println(field); 22 } 23 24 // 該方法能獲取到公有的、私有的、受保護的字段 25 Field[] declaredFields = personClass.getDeclaredFields(); 26 for (Field field : declaredFields) { 27 // System.out.println(field); 28 } 29 30 // 該方法只能獲取到公有的字段,若傳入的是私有或受保護的則會報錯NoSuchFieldException 31 Field nameFieldPublic = personClass.getField("className"); 32 33 nameFieldPublic.set(p, "卓越班"); 34 Method getClassName = personClass.getMethod("getClassName"); 35 Object className = getClassName.invoke(p); 36 System.out.println(className); 37 38 // 該方法可以獲取到公有的、私有的、受保護的屬性 39 Field nameFieldPrivate = personClass.getDeclaredField("name"); 40 41 nameFieldPrivate.setAccessible(true); 42 // System.out.println(nameFieldPrivate); 43 nameFieldPrivate.set(p, "Jay"); 44 System.out.println(p); 45 46 // 獲取到私有屬性age 47 Field ageFieldPrivate = personClass.getDeclaredField("age"); 48 // 忽略修飾符訪問檢查 49 ageFieldPrivate.setAccessible(true); 50 // 設置age的值,必須指明修改的是哪個對象的屬性 51 ageFieldPrivate.set(p, 24); 52 System.out.println(p); 53 54 } 55 56 }

 1 package reflect;
 2 
 3 public class Person {
 4     
 5     private String name;
 6     private int age;
 7     protected double weight;
 8     public String className;
 9     
10     public Person() {
11     }
12     
13     private Person(int age) {
14         
15     }
16     
17     public Person(String name, int age, double weight, String className) {
18         super();
19         this.name = name;
20         this.age = age;
21         this.weight = weight;
22         this.className = className;
23     }
24 
25     public double getWeight() {
26         return weight;
27     }
28 
29     public void setWeight(double weight) {
30         this.weight = weight;
31     }
32 
33     public String getClassName() {
34         return className;
35     }
36 
37     public void setClassName(String className) {
38         this.className = className;
39     }
40 
41     public String getName() {
42         return name;
43     }
44 
45     public void setName(String name) {
46         this.name = name;
47     }
48 
49     private int getAge() {
50         return age;
51     }
52 
53     public void setAge(int age) {
54         this.age = age;
55     }
56 
57     @Override
58     public String toString() {
59         return "Person [name=" + name + ", age=" + age + ", weight=" + weight
60                 + ", className=" + className + "]";
61     }
62 
63     
64 
65 }

【反射之Field】獲取字段