Java反射基礎(二)

獲取域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方法

相關文章
相關標籤/搜索