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

来源:互联网 发布:mac 查看系统运行程序 编辑:程序博客网 时间:2024/05/16 10:00

大家好!这篇文章也是关于反射机制中的问题,具体是关于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.注意前后逻辑关系,自行体会。
好的,谢谢你看到这里!晚安!
你要去相信,没有到不了的明天!
让我耳目一新,是通感!

原创粉丝点击