关于Java反射机制中的Field简单尝试与示例以及说明

大家好!这篇文章也是关于反射机制中的问题,具体是关于Field(字段)的一些简单问题,写的不足之处,还请大家多多指教。同时,小芳还想再次说明,文章针对于对Java语言有一定基础的小伙伴!请见谅!
首先,写一个普通的pojo,注意里面成员的修饰符,有使用private和public修饰的成员

package com.mec.about_reflection;

public class PersonClass {
    //注意name前面有public修饰
    public  String  name;
    //注意这两个成员前有private修饰
    private  int  age;
    private  String  sex;

    public PersonClass() {
    }

    public PersonClass(String name, int age, String sex) {
        super();
        this.setName(name);
        this.setAge(age);
        this.setSex(sex);
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    @Override
    public String toString() {
        return "PersonClass [name=" + name + ", age=" + age + ", sex=" + sex + "]";
    }
}

接下来,我在main()函数获取上面的类的字段成员,代码如下:

package com.mec.about_reflection.field;
import java.lang.reflect.Field;
import com.mec.about_reflection.PersonClass;

public class AboutField {
    public static void main(String[] args) throws NoSuchFieldException, SecurityException {
        //通过反射机制获取想要获得字段成员的这个类
        Object object = new PersonClass();
        Class clazz = object.getClass();
        //取出这个类的字段成员,注意getDeclaredFields()方法获取的还包括这个类中用private修饰的字段成员,而且获取得一般都是数组
        Field[] fields = clazz.getDeclaredFields();
        //遍历这个类中的所有字段成员,并输出
        for(Field field : fields) {
            System.out.println("字段成员:" + field.getName());
            //输出结果为:
            字段成员:name
            字段成员:age
            字段成员:sex
        }
            //获取这个类中的指定字段成员,此时获取的为私有成员(用private修饰)
            Field fieldOne = clazz.getDeclaredField("age");
            System.out.println("获取指定对象成员名称:" + fieldOne.getName());
            //输出结果:获取指定对象成员名称:age
            //因为这个类的‘age’成员是被private修饰,所以设置它的可见性
            fieldOne.setAccessible(true);
            //给该类创建一个对象,并传参数
            PersonClass personClass = new PersonClass("芳芳",108,"女");

            try {
                //通过这个类的对象获取指定字段成员的值,注意此时获取的是age的值
                Object objectOne = fieldOne.get(personClass);
                System.out.println("获取指定对象字段‘age’的field的值:" + objectOne);
                //输出结果:获取指定对象字段‘age’的field的值:108
                //设置这个成员的值,这里注意这个方法的参数,第一个参数是该类一个对象
                fieldOne.set(personClass, 88);
                //对于私有成员,不能直接通过点来获取它的输出值,在这里可以用get方法输出,对于public修饰的成员可以直接通过点来输出它的值

                System.out.println("设定指定对象字段‘age’的field的值:" + personClass.getAge());
                //输出结果为:设定指定对象字段‘age’的field的值:88
                //System.exit(0);这一行是为了避免一串大写的红色的错误而写的,今天在这句话之后我也写了输出,但是都没有再输出,它有阻断后续程序执行的作用(我猜测)


                //获取公共字段成员属性(用public修饰)
                Field fieldTwo = clazz.getDeclaredField("name");
                System.out.println("输出fieldTwo:" + fieldTwo);
                //输出结果:输出fieldTwo:public java.lang.String com.mec.about_reflection.PersonClass.name

                System.out.println("获取指定名称的field成员:" + fieldTwo.getName());
                //输出结果:获取指定名称的field成员:name
                //给这个类创建一个实例
                PersonClass personClassTwo = new PersonClass("远远",22,"男");
                //获取此实例中指定名称的字段成员的值
                Object objectTwo = fieldTwo.get(personClassTwo);
                System.out.println("得到指定对象的‘name’的field的值:" + objectTwo);
                //输出结果:得到指定对象的‘name’的field的值:远远
                //设置这个成员中指定字段成员的值
                fieldTwo.set(personClassTwo, "静静");
                System.out.println("设定含有public修饰的成员‘name’:" + personClassTwo.name);
                //输出结果:设定含有public修饰的成员‘name’:静静

            } catch (IllegalArgumentException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        }
}

看完了代码,在这里我主要还想总结两点:
1.对于一个类的私有字段成员我们也可以获取它的值,例如小芳的这篇文章中的age成员,它是由private修饰的,但是我们依旧可以对它进行获取和更改,做这些的前提是对这个field设置setAccessible()方法,而且,在获取这个成员的值时,不能直接用对象点方法(object.field),而是要用它的get方法。而对于一个public修饰的字段成员,无需设置setAccessible()方法就可对其进行获取与更改,在获取值时也可以直接使用对象点方法来获取;
2.注意前后逻辑关系,自行体会。
好的,谢谢你看到这里!晚安!
你要去相信,没有到不了的明天!
让我耳目一新,是通感!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值