关于Java反射机制中的Field简单尝试与示例以及说明
2017-12-06 23:12
781 查看
大家好!这篇文章也是关于反射机制中的问题,具体是关于Field(字段)的一些简单问题,写的不足之处,还请大家多多指教。同时,小芳还想再次说明,文章针对于对Java语言有一定基础的小伙伴!请见谅!
首先,写一个普通的pojo,注意里面成员的修饰符,有使用private和public修饰的成员
接下来,我在main()函数获取上面的类的字段成员,代码如下:
看完了代码,在这里我主要还想总结两点:
1.对于一个类的私有字段成员我们也可以获取它的值,例如小芳的这篇文章中的age成员,它是由private修饰的,但是我们依旧可以对它进行获取和更改,做这些的前提是对这个field设置setAccessible()方法,而且,在获取这个成员的值时,不能直接用对象点方法(object.field),而是要用它的get方法。而对于一个public修饰的字段成员,无需设置setAccessible()方法就可对其进行获取与更改,在获取值时也可以直接使用对象点方法来获取;
2.注意前后逻辑关系,自行体会。
好的,谢谢你看到这里!晚安!
你要去相信,没有到不了的明天!
首先,写一个普通的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. 4000 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.注意前后逻辑关系,自行体会。
好的,谢谢你看到这里!晚安!
你要去相信,没有到不了的明天!
相关文章推荐
- 浅谈Java中的反射机制以及Class、Constructor、Field、Method简单框架原理
- 关于java反射的简单尝试
- Java中的反射机制(五) 关于Class类的补充说明
- 傻哲笔记1.1 - 《疯狂JAVA讲义》Java小历史以及运行机制简单说明
- Java 反射机制(包括组成、结构、示例说明等内容)
- Java 反射机制(包括组成、结构、示例说明等内容)
- 关于JAVA do--while的简单示例说明记录
- [转载]Java 反射机制(包括组成、结构、示例说明等内容)
- 关于java方法的重载(Overloading),覆写(Override)以及final 方法的几点说明
- java 反射机制(一)简单实例
- Java 反射的简单示例
- 关于Java反射机制的一个实例
- Java 反射机制 的超简单实例分析
- 关于Java中反射机制的原理理解
- java 简单示例关于swingworker
- C#关于log4net(LogForNet)的使用简单说明以及介绍
- 关于java反射机制
- 关于java方法的重载(Overloading),覆写(Override)以及final 方法的几点说明
- (转)关于java内省机制的一些描述与说明
- Java 反射机制中 getMethod()和getDeclaredField()区别