獲取域java
1. 經過反射API能夠獲取到類中公開的靜態域和對象中的實例域。獲得表示域的java.lang.reflect.Field類的對象以後,就能夠獲取和設置域的值。this
與獲取構造方法相似,Class類中有4個方法用來獲取域:spa
getFileds()、getFiled(fieldName)、 getDeclaredFields()、getDeclaredField(fieldName),其含義與獲取構造方法的4個方法相似。code
靜態域和實例域的區別是:在使用靜態域的時候,不須要提供具體對象實例,使用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 //設置靜態域值時,傳入null 22 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 }
輸出:blog
ycc
26
1000.0get
獲取方法io
4個獲取方法:class
getMethods() 、 getMethod(methodName)、 getDeclaredMethod(methodName)、 getDeclaredMethods()test
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方法