• 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 }
  • 相关阅读:
    eclipse工具
    Tag
    JSP模版
    Eclipse断点调试
    JavaBean
    验证码设计
    在IE中提示404错误
    序列化与反序列化
    文件编码问题
    强类型,弱类型和推断类型
  • 原文地址:https://www.cnblogs.com/hebao0514/p/4565776.html
Copyright © 2020-2023  润新知