zoukankan      html  css  js  c++  java
  • 00112_通过反射获取成员变量并使用

    1、在反射机制中,把类中的成员变量使用类Field表示;  

    2、通过Class类中提供的方法获取成员变量:

      (1)返回一个成员变量

    public Field getField(String name) 获取指定的 public修饰的变量
    public Field getDeclaredField(String name) 获取指定的任意变量

      (2)返回多个成员变量

    public Field[] getFields() 获取所有public 修饰的变量
    public Field[] getDeclaredFields() 获取所有的 变量 (包含私有)

      (3)获取成员变量代码演示

     1 package cn.gzdlh_01_Reflect;
     2 
     3 import java.lang.reflect.Field;
     4 
     5 public class FieldDemo {
     6     public static void main(String[] args) throws ClassNotFoundException,
     7             NoSuchFieldException, SecurityException {
     8         // 获取Class对象
     9         Class c = Class.forName("cn.gzdlh_01_Reflect.Person");
    10 
    11         // 获取成员变量
    12         // 多个变量
    13         // Field[] fields = c.getFields();
    14         Field[] fields = c.getDeclaredFields();
    15         for (Field field : fields) {
    16             System.out.println(field);
    17         }
    18         System.out.println("-----------------");
    19         // 一个变量
    20         // public int age;
    21         Field ageField = c.getField("age");
    22         System.out.println(ageField);
    23 
    24         // private String address
    25         Field addressField = c.getDeclaredField("address");
    26         System.out.println(addressField);
    27     }
    28 }

    3、通过反射,创建对象,获取指定的成员变量,进行赋值与获取值操作

      (1)获取成员变量,步骤如下:

        ①获取Class对象;

        ②获取构造方法;

        ③通过构造方法,创建对象;

        ④获取指定的成员变量(私有成员变量,通过setAccessible(boolean flag)方法暴力访问);

        ⑤通过方法,给指定对象的指定成员变量赋值或者获取值。

    public void set(Object obj, Object value)
    在指定对象obj中,将此 Field 对象表示的成员变量设置为指定的新值
    public Object get(Object obj)
    返回指定对象obj中,此 Field 对象表示的成员变量的值

      (2)代码演示

     1 package cn.gzdlh_01_Reflect;
     2 
     3 import java.lang.reflect.Constructor;
     4 import java.lang.reflect.Field;
     5 import java.lang.reflect.InvocationTargetException;
     6 
     7 public class FieldDemo2 {
     8     public static void main(String[] args) throws ClassNotFoundException,
     9             NoSuchMethodException, SecurityException, InstantiationException,
    10             IllegalAccessException, IllegalArgumentException,
    11             InvocationTargetException, NoSuchFieldException {
    12         // 1,获取Class对象
    13         Class c = Class.forName("cn.gzdlh_01_Reflect.Person");
    14         // 2,获取构造方法
    15         // public Person(String name)
    16         Constructor con = c.getConstructor(String.class);
    17         // 3,通过构造方法,创建对象
    18         Object obj = con.newInstance("gzdlh");
    19         // 4,获取指定的成员变量
    20         // public String name;
    21         Field nameField = c.getField("name");
    22         // public int age;
    23         Field ageField = c.getField("age");
    24         // private String address;
    25         Field addressField = c.getDeclaredField("address");
    26         addressField.setAccessible(true); // 取消 Java 语言访问检查
    27 
    28         // 5,通过方法,给指定对象的指定成员变量赋值或者获取值
    29         System.out.println("name = " + nameField.get(obj));
    30         System.out.println("age = " + ageField.get(obj));
    31         System.out.println("address = " + addressField.get(obj));
    32 
    33         // 赋值
    34         ageField.set(obj, 23);
    35         addressField.set(obj, "广州信息港");
    36 
    37         System.out.println("------------------------");
    38         System.out.println("name = " + nameField.get(obj));
    39         System.out.println("age = " + ageField.get(obj));
    40         System.out.println("address = " + addressField.get(obj));
    41     }
    42 }
  • 相关阅读:
    Google黑板报上连载的长文
    sql server2000 数据同步
    sql server 2000 数据同步(2)
    reset sql server express sa password
    Fetion分析之二:服务器地址从何而来——变态的配置文件(转)
    CentOS软件安装血泪经验(转)
    《Unix & Linux 大学教程》(转)
    有关CentOS6的man报错
    linux 命令行学习笔记
    ubuntu 無法掛載ntfs分區
  • 原文地址:https://www.cnblogs.com/gzdlh/p/8159239.html
Copyright © 2011-2022 走看看