標籤:strong file 靜態 void imp edm setname exception span
擷取域
1. 通過反射API可以擷取到類中公開的靜態域和對象中的執行個體域。得到表示域的java.lang.reflect.Field類的對象之後,就可以擷取和設定域的值。
與擷取構造方法類似,Class類中有4個方法用來擷取域:
getFileds()、getFiled(fieldName)、 getDeclaredFields()、getDeclaredField(fieldName),其含義與擷取構造方法的4個方法類似。
靜態域和執行個體域的區別是:在使用靜態域的時候,不需要提供具體對象執行個體,使用null即可,也可以使用對象執行個體;而使用執行個體域的時候,必須提供對象執行個體。
1 package jichu; 2 /** 3 *@author 作者 Yu chenchen 4 *@version 建立時間:2017年4月29日 下午1:32:38 5 *類說明: 6 */ 7 public class User { 8 public String name; 9 public static int age;10 private double salary;11 12 public void print1(){13 System.out.println("調用公有非靜態print1方法");14 }15 public static void print2(){16 System.out.println("調用公有靜態print2方法");17 }18 private void print3(){19 System.out.println("調用私人print3方法");20 }21 22 public String getName() {23 return name;24 }25 public void setName(String name) {26 this.name = name;27 }28 public static int getAge() {29 return age;30 }31 public static void setAge(int age) {32 User.age = age;33 }34 public double getSalary() {35 return salary;36 }37 public void setSalary(double salary) {38 this.salary = salary;39 } 40 }
1 package jichu; 2 3 import java.lang.reflect.Field; 4 5 /** 6 *@author 作者 Yu chenchen 7 *@version 建立時間:2017年4月29日 下午12:20:50 8 *類說明: 9 */10 public class TestReflectionFields {11 12 public void test() throws Exception{13 //擷取公開執行個體域14 User user = new User();15 Field fieldName = User.class.getDeclaredField("name");16 //設定執行個體域值時,必須傳入執行個體對象17 fieldName.set(user, "ycc");18 19 //擷取靜態域20 Field fieldAge = User.class.getDeclaredField("age");21 //設定靜態域值時,傳入null22 fieldAge.set(null, 25);23 //設定靜態域值時,也可以傳入執行個體對象24 fieldAge.set(user, 26); 25 26 //擷取私人域27 Field fieldSalary = User.class.getDeclaredField("salary");28 //必須設定可以訪問私人域許可權29 fieldSalary.setAccessible(true);30 fieldSalary.set(user,1000.00); 31 32 System.out.println(user.name);33 System.out.println(User.age);34 System.out.println(user.getSalary());35 36 }37 public static void main(String[] args) {38 try {39 new TestReflectionFields().test();40 } catch (Exception e) {41 e.printStackTrace();42 }43 }44 }
輸出:
ycc
26
1000.0
擷取方法
4個擷取方法:
getMethods() 、 getMethod(methodName)、 getDeclaredMethod(methodName)、 getDeclaredMethods()
1 package jichu; 2 3 import java.lang.reflect.Method; 4 5 /** 6 *@author 作者 Yu chenchen 7 *@version 建立時間:2017年4月29日 下午1:23:01 8 *類說明: 9 */10 public class TestReflectionMethods {11 12 public static void main(String[] args) throws Exception {13 User user = new User();14 //擷取公有非靜態方法15 Method method1 = User.class.getDeclaredMethod("print1");16 method1.invoke(user);17 18 //擷取公有靜態方法19 Method method2 = User.class.getDeclaredMethod("print2");20 method2.invoke((User)null);21 //也可以這樣22 method2.invoke(user);23 24 //擷取私人方法25 Method method3 = User.class.getDeclaredMethod("print3");26 //必須設定可以訪問私人方法許可權27 method3.setAccessible(true);28 method3.invoke(user);29 30 }31 32 }
輸出:
調用公有非靜態print1方法
調用公有靜態print2方法
調用公有靜態print2方法
調用私人print2方法
Java反射基礎(二)