Android(java)学习笔记50:通过反射获取成员变量和成员方法并且使用

1. 反射获取成员变量并且使用:

(1)获取字节码文件对象:

        Class c = Class.forName("cn.itcast_01.Person");

(2)使用无参构造器创建对象

Constructor  con = c.getConstructor();

Object  obj = con.newInstance();  

(3)获取所有的成员变量:

       Field[] fields = c.getFields();//获取所有公共(public)成员变量

       Field[] fields = c.getDeclaredFields();//获取所有成员变量

(4)获得单个成员变量:

      Field  addressField = c.getField("address");

     addressField .set(obj,  "北京" );//  给obj对象的addressField字段设置值为"北京"

(5)访问私有字段(暴力访问)

Field  nameFeild = c.getDeclaredField("name");

nameField.setAccessible(true);

nameField.set(obj , "林青霞");

 测试代码:

 1 package cn.itcast_03;
 2 
 3 import java.lang.reflect.Constructor;
 4 import java.lang.reflect.Field;
 5 
 6 /*
 7  * 通过发生获取成员变量并使用
 8  */
 9 public class ReflectDemo {
10     public static void main(String[] args) throws Exception {
11         // 获取字节码文件对象
12         Class c = Class.forName("cn.itcast_01.Person");
13 
14         // 获取所有的成员变量
15         // Field[] fields = c.getFields();
16         // Field[] fields = c.getDeclaredFields();
17         // for (Field field : fields) {
18         // System.out.println(field);
19         // }
20 
21         /*
22          * Person p = new Person(); p.address = "北京"; System.out.println(p);
23          */
24 
25         // 通过无参构造方法创建对象
26         Constructor con = c.getConstructor();
27         Object obj = con.newInstance();
28         System.out.println(obj);
29 
30         // 获取单个的成员变量
31         // 获取address并对其赋值
32         Field addressField = c.getField("address");
33         // public void set(Object obj,Object value)
34         // 将指定对象变量上此 Field 对象表示的字段设置为指定的新值。
35         addressField.set(obj, "北京"); // 给obj对象的addressField字段设置值为"北京"
36         System.out.println(obj);
37 
38         // 获取name并对其赋值
39         // NoSuchFieldException
40         Field nameField = c.getDeclaredField("name");
41         // IllegalAccessException
42         nameField.setAccessible(true);
43         nameField.set(obj, "林青霞");
44         System.out.println(obj);
45 
46         // 获取age并对其赋值
47         Field ageField = c.getDeclaredField("age");
48         ageField.setAccessible(true);
49         ageField.set(obj, 27);
50         System.out.println(obj);
51     }
52 }

2. 通过反射获取成员方法

(1)通过反射获取无参无返回值成员方法并使用:

 代码示例如下:

 1 package cn.itcast_04;
 2 
 3 import java.lang.reflect.Constructor;
 4 import java.lang.reflect.Method;
 5 
 6 public class ReflectDemo {
 7     public static void main(String[] args) throws Exception {
 8         // 获取字节码文件对象
 9         Class c = Class.forName("cn.itcast_01.Person");
10 
11         // 获取所有的方法
12         // Method[] methods = c.getMethods(); // 获取自己的包括父亲的公共方法
13         // Method[] methods = c.getDeclaredMethods(); // 获取自己的所有的方法
14         // for (Method method : methods) {
15         // System.out.println(method);
16         // }
17 
18         Constructor con = c.getConstructor();
19         Object obj = con.newInstance();
20 
21         /*
22          * Person p = new Person(); p.show();
23          */
24 
25         // 获取单个方法并使用
26         // public void show()
27         // public Method getMethod(String name,Class<?>... parameterTypes)
28         // 第一个参数表示的方法名,第二个参数表示的是方法的参数的class类型
29         Method m1 = c.getMethod("show");
30         // obj.m1(); // 错误
31         // public Object invoke(Object obj,Object... args)
32         // 返回值是Object接收,第一个参数表示对象是谁,第二参数表示调用该方法的实际参数
33         m1.invoke(obj); // 调用obj对象的m1方法
34 
35         System.out.println("----------");
36         // public void method(String s)
37         Method m2 = c.getMethod("method", String.class);
38         m2.invoke(obj, "hello");
39         System.out.println("----------");
40 
41         // public String getString(String s, int i)
42         Method m3 = c.getMethod("getString", String.class, int.class);
43         Object objString = m3.invoke(obj, "hello", 100);
44         System.out.println(objString);
45         // String s = (String)m3.invoke(obj, "hello",100);
46         // System.out.println(s);
47         System.out.println("----------");
48 
49         // private void function()
50         Method m4 = c.getDeclaredMethod("function");
51         m4.setAccessible(true);
52         m4.invoke(obj);
53     }
54 }
原文地址:https://www.cnblogs.com/hebao0514/p/4565776.html