Java反射基础(二)

获取域

  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         //设置静态域值时,传入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 }

输出:

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方法

 

posted @ 2017-04-29 13:47  coollife  阅读(212)  评论(0编辑  收藏  举报