访问成员变量(反射)

文章目录


前言

        为了实现随时随地调用某个类的某个成员变量,我们可以通过反射的Field类进行调用。这其中需要我们获取该类的Class对象,再调用Field类的相关方法,实时地灵活地调用或改变成员变量。记得添加try-catch语句并且是java.lang包下的方法。


一、获取成员变量的方法

        Field类型的对象是指以成员变量为对象的变量。在我们获取该成员变量时,根据需要指定Field类型对象是否为数组。

获取成员变量的方法
方法功能描述
getFields()获取该类的所有公有的成员变量
getField(String name)获取指定的该类中的公开的成员变量(name字符串决定)
getDeciaredFields()获取该类的所有成员变量
getDeclaredField(String name)获取指定的该类的成员变量

        实操展示:将Demo类实例化,再转化为Class类对象,Field对象通过以上方法获取其中的成员属性。

Class Demo{
    public int id="101";
    private String name="王五";
}

Demo demo = new Demo();
Class class = demo.getClass;

Field f1[] = class.getFields();
//获取Demo类的所有的公有的成员变量

Field f2 = class.getDeclaredField("name");
//获取Demo类中私有成员属性"name"

二、Field类

1.常用方法

         以下时Field类的常用方法:

Field类的常用方法
方法功能描述
getName()获得该成员变量的名称
getType()获得表示该成员变量类型的Class对象
get(Object obj)获得指定对象obj中成员变量的值,返回值为Object型
set(Object obj,Object value) 将指定的obj类中的成员变量的值设置为value
getInt(Object obj)获得指定类中类型为int的成员变量的值
setInt(Object obj,int i)将指定的obj类中的int类型的成员变量的值设置为value
getFloat(Object obj)获得指定对象obj类中类型为float的成员变量的值
setFloat(Object obj,Float f)将指定对象obj中类型为float的成员变量的值设置为f
getBoolean(Object obj)获得指定对象obj中类型为boolean的成员变量的值
setBoolean(Object obj,boolean z)j将指定对象obj中类型为boolean的成员变量的值设置为z
setAccessible(boolean falg)设置为true时忽略private修饰符私有权限,直接访问成员变量
getModifiers()获得可以解析出该成员变量所采用修饰符的整数值

        注意:以上方法大部分需要写在try-catch语句中,具体看问题报错。 

2.实操展示

        实例:创建一个Demo类,在其中创建各种成员变量;创建一个See类,使用上述方法获取Demo类成员变量的详细信息;创建Use类,使用上述方法获取成员变量数值,或者改变其值。

        Demo类:

public class Demo {
    public String name;
    public int age;
    private int id;  //私有
    
}

        See类:

import java.lang.reflect.*;
public class See {
    public static void main(String[] args) {
        Demo demo = new Demo();
        Class class1=demo.getClass();
        try {
            Field field[] = class1.getDeclaredFields(); //获取Demo的Class类所有成员变量属性
            for(int i=0;i<field.length;i++){
                System.out.println("成员变量的名称:"+field[i].getName());
                System.out.println("成员变量的类型:"+field[i].getType());
                System.out.println("成员变量的修饰符权限"+Modifier.toString(field[i].getModifiers()));
                System.out.println("------------------------------");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

        运行结果:

        

        通过getDeciaredFields()方法将Demo类成员变量转化为Field类对象,使用Field类常用方法即可在该类main方法中获取到Demo类成员方法的详细情况。

        Use类:

import java.lang.reflect.*;
public class Use {
    public static void main(String[] args) {
        Demo demo = new Demo();
        Class class1 = demo.getClass();
        Field field[] = class1.getDeclaredFields();
            for(int i=0;i<field.length;i++){
                    try {
                        System.out.println("输出"+field[i].getName()+"成员变量原本的值:"+field[i].get(demo));
                        Class fieldType = field[i].getType();   //Field类常用方法
                        System.out.println("数据类型:"+fieldType);
                        if(fieldType.equals(int.class)){//判断该成员变量的类型是否为int
                            System.out.println("使用setInt()方法修改成员变量");
                            field[i].setInt(demo, 20);
                    
                        }else if(fieldType.equals(String.class)){//判断该成员变量类型是否为String
                            System.out.println("使用set()方法修改成员变量");
                            field[i].set(demo,"王五");
                          
                        }
                        System.out.println("修改后的值为:"+field[i].get(demo));
                        System.out.println("-------------------------------------");
                    } catch (Exception e) {
                        System.out.println("try-catch捕捉到异常,使用setAccessible()方法更改成员变量权限");
                        field[i].setAccessible(true);
                        try {
                            System.out.println("输出"+field[i].getName()+"成员变量原本的值:"+field[i].get(demo));
                            System.out.println("使用setInt()方法修改成员变量");
                            field[i].setInt(demo, 101); //将私有权限的成员变量修改数值
                            System.out.println("修改后的值为:"+field[i].get(demo));
                        } catch (Exception e2) {
                            e2.printStackTrace();
                        }
                    }
                }
            }
        }

        运行结果:

 

        通过使用Field类的常用方法get()和set(),实时地获取和修改该类对象的成员变量的值。 


总结

        以上就是今天要讲的内容,本文仅仅简单介绍了访问成员变量的使用,而Field类提供了大量能使我们便捷地实时处理数据的方法,指正和补充的内容欢迎在评论区中留言。

  • 15
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

喵果森森

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值