java通过反射访问成员变量详解

KLQ 2020-08-24 16:00:02 java常见问答 5929

之前给大家介绍了java通过反射执行方法的内容,那么下面要给大家介绍的就是java通过反射访问成员变量的内容,一起来看看吧。

通过下面的任意一个方法访问成员变量的时候,将返回Field类型的对象或数组。

Field类型的对象或数组

上面的方法返回的Field对象代表一个成员变量,例,访问一个名称是price的成员变量,示例代码:

object.getDeciaredField("price");

Field类的常用方法:

Field类的常用方法

示例:

下面的话,就让我们通过一个案例来演示一下怎样调用Field类的方法获取动态类中各个成员的信息。

首先的话,要先创建一个Book2类,在这个类当中,依次声明一个String、int、float以及boolean类型的成员,并且,设置不同的访问作用域,Book2类代码:

public class Book2
{
    String name;
    public int id;
    private float price;
    protected boolean isLoan;
}

编写测试类Test03,在这个类的main()方法当中,通过反射访问Book2类当中的所有成员,并且,把这名成员的名称和类型信息输出到控制台。

Test03类代码:

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
public class Test03
{
    public static void main(String[] args)
    {
        Book2 book = new Book2();
        // 获取动态类Book2
        Class class1 = book.getClass();
        // 获取Book2类的所有成员
        Field[] declaredFields = class1.getDeclaredFields();
        // 遍历所有的成员
        for (int i = 0; i < declaredFields.length; i++)
        {
            // 获取类中的成员变量
            Field field = declaredFields[i];
            System.out.println("成员名称为:" + field.getName());
            Class fieldType = field.getType();
            System.out.println("成员类型为:" + fieldType);
            boolean isTurn = true;
            while (isTurn)
            {
                try
                {
                    // 如果该成员变量的访问权限为private,则抛出异常
                    isTurn = false;
                    System.out.println("修改前成员的值为:" + field.get(book));
                    // 判断成员类型是否为int
                    if (fieldType.equals(int.class))
                    {
                        System.out.println("利用setInt()方法修改成员的值");
                        field.setInt(book, 100);
                    }
                    else if (fieldType.equals(float.class))
                    {
                        // 判断成员变量类型是否为float
                        System.out.println("利用setFloat()方法修改成员的值");
                        field.setFloat(book, 29.815 f);
                    }
                    else if (fieldType.equals(boolean.class))
                    {
                        // 判断成员变量是否为boolean
                        System.out.println("利用setBoolean()方法修改成员的值");
                        field.setBoolean(book, true);
                    }
                    else
                    {
                        System.out.println("利用set()方法修改成员的值");
                        field.set(book, "Java编程");
                    }
                    System.out.println("修改后成员的值为:" + field.get(book));
                }
                catch (Exception e)
                {
                    System.out.println("在设置成员变量值时抛出异常,下面执行setAccessible()方法");
                    field.setAccessible(true);
                    isTurn = true;
                }
            }
            System.out.println("=============================\n");
        }
    }
}

运行测试类Test03,程序将会依次动态访问Book2类当中的所有成员,访问name成员的运行效果:

成员名称为:name
成员类型为:class java.lang.String
修改前成员的值为:null
利用set()方法修改成员的值
修改后成员的值为:Java编程
=============================

访问id成员的运行效果:

成员名称为:id
成员类型为:int
修改前成员的值为:0
利用setInt()方法修改成员的值
修改后成员的值为:100
=============================

访问price成员的运行效果:

成员名称为:price
成员类型为:float
在设置成员变量值时抛出异常,下面执行setAccessible()方法
修改前成员的值为:0.0
利用setFloat()方法修改成员的值
修改后成员的值为:29.815
=============================

访问isLoan成员的运行效果:

成员名称为:isLoan
成员类型为:boolean
修改前成员的值为:false
利用setBoolean()方法修改成员的值
修改后成员的值为:true
=============================

这个方面的知识就给你介绍到这里啦,更多和java反射相关的java基础知识,可以继续的通过关注奇Q工具网来进行了解呢。

推荐阅读:

java通过反射访问构造方法详解

java反射机制API详解

java反射机制是什么?概念功能优缺点详细介绍