通过反射访问成员变量(学习笔记)

本文介绍了如何使用反射API访问Java类中的成员变量,包括获取不同权限的成员变量、修改成员变量的值等操作,并通过示例代码展示了具体实现过程。

访问成员变量

这一部分的内容其实很简单,主要分为三个小部分

  1. 通过getFiled()等方法获得类中的成员变量,然后以数组形式返回

  2. 通过getName(),getType()等方法获得成员变量的具体信息

  3. 通过setInt(),set()等方法为成员变量赋值

    首先我们先来看第一部分,通过getFiled()等方法获取类中的成员变量
    其实这一步和我们上次讲的获得构造方法差不多


 getFields()  此方法获得所有权限为public的成员变量
 getField(String name) 获得权限为public的指定成员变量
 getDelcareFields() 获得所有成员变量,按指定顺序返回
 getDelcareField(String name) 获得指定成员变量

接下来的二三两部分我们通过代码来学习,看代码

public class Example_02 {
    public int i;
    protected float f;
    private boolean b;
    public String s;

}

上述代码我们创建了一个Example_02得类,里面我们创建了一些不同基本类型的成员变量,分别通过不同的权限修饰符来修饰

public class Main_02 {
    public static void main(String[] args) throws ClassNotFoundException {
        Example_02 example=new Example_02();//创建Example_02对象;
        Class exampleC=example.getClass();//利用getClass方法,返回一个Class对象
        //Class exampleC=Class.forName("annotation.Example_02");
        Field [] declareFields=exampleC.getFields();//获得所有成员变量的集合;
        for (int i = 0; i < declareFields.length; i++) {
            Field field=declareFields[i];//获得特定的成员变量
            System.out.println("名称为:"+field.getName());
            Class fieldType=field.getType();//获得成员变量的类型
            System.out.println("类型为:"+fieldType);
            boolean istrue=true;
            while(istrue){
                try {
                    istrue=false;
                    System.out.println("修改前的值为:"+field.get(example));//获得修改前的成员变量值
                    //判断成员变量的类型是否为int型
                    if (fieldType.equals(int.class)) {
                        System.out.println("利用setint修改成员变量的值");
                        field.setInt(example, 200);//为int型成员变量赋值
                    }
                    //判断成员变量的类型是否为boolean型
                    else if (fieldType.equals(boolean.class)) {
                        System.out.println("利用setBoolean修改成员变量的值");
                        field.setBoolean(example, true);//为boolean型成员变量赋值
                    }
                    //判断成员变量的类型是否为float型
                    else if (fieldType.equals(float.class)) {
                        System.out.println("利用setFloat修改成员变量的值");
                        field.setFloat(example, 15.6f);//为float型成员变量赋值
                    }
                    else{
                        System.out.println("利用set修改成员变量的值");
                        field.set(example, "李奇峰");//可以为各种成员变量赋值

                    }
                    System.out.println("修改后的值为:"+field.get(example));
                } catch (Exception e) {
                    // TODO: handle exception
                    System.out.println("在设置成员变量时抛出异常,下面执行setAccessible()方法");
                    field.setAccessible(true);
                    istrue=true;

                }
            }
            System.out.println();
        }
    }

}

上述代码输出的结果为

名称为:i
类型为:int
修改前的值为:0
利用setint修改成员变量的值
修改后的值为:200

名称为:f
类型为:float
修改前的值为:0.0
利用setFloat修改成员变量的值
修改后的值为:15.6

名称为:b
类型为:boolean
修改前的值为:false
利用setBoolean修改成员变量的值
修改后的值为:true

名称为:s
类型为:class java.lang.String
修改前的值为:null
利用set修改成员变量的值
修改后的值为:李奇峰

上述代码的演示中我们可以看到,对于set()等方法而言呢,我们可以set的都是基本类型,例如setInt(),setFloat()等。
而我们的get()方法获取的是指定对象的成员变量的值,返回类型为Object 类
当然,还可以getInt(),getBoolean();等

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值