Java反射获取对象成员属性,getFields()与getDeclaredFields()方法的区别
Java反射获取对象成员属性,getFields()与getDeclaredFields()方法的区别
在工作中遇到一个问题,就是你需要去判断某个字符串是不是对象的某个成员属性名,然后根据判断结果去操作这个成员属性。
想了下之后,我们可以根据Java反射中的getDeclaredFields()或者getFields()方法来实现我们的需求。
首先说明一下getDeclaredFields()和getFields()这两个方法的区别:
getFields(): 获取某个类的所有的public字段,其中是包括父类的public字段的。
getDeclaredFields():获取某个类的自身的所有字段,不包括父类的字段。
示例1:--子类、父类
package com.test.test; import java.lang.reflect.Field;
import java.lang.reflect.Modifier; public class Demo {
/**
* Java反射获取对象成员属性,getFields()与getDeclaredFields()方法的区别
* --子类、父类
*
* @param args
* @throws IllegalAccessException
*/
public static void main(String[] args) throws IllegalAccessException { Person.Student student = new Person.Student();
student.setGrade(99);
student.setStudentNumber("20191223");
student.setName("张三");
student.setAge(22); System.out.println("======getFields()======");
Field[] fields = student.getClass().getFields();
for (Field field : fields) {
System.out.println("成员属性:" + field.getName() + " 成员属性修饰符: " + Modifier.toString(field.getModifiers()) + " 成员属性值: " + field.get(student));
} System.out.println("======getDeclaredFields()======");
Field[] declaredFields = student.getClass().getDeclaredFields();
for (Field field : declaredFields) {
// 获取原来的访问控制权限
boolean accessFlag = field.isAccessible();
if (!field.isAccessible()) field.setAccessible(true);
System.out.println("成员属性:" + field.getName() + " 成员属性修饰符: " + Modifier.toString(field.getModifiers()) + " 成员属性值: " + field.get(student));
field.setAccessible(accessFlag);
}
}
}
示例1--子类、父类
示例1结果:
======getFields()======
成员属性:studentNumber 成员属性修饰符: public 成员属性值: 20191223
成员属性:name 成员属性修饰符: public 成员属性值: 张三
======getDeclaredFields()======
成员属性:studentNumber 成员属性修饰符: public 成员属性值: 20191223
成员属性:grade 成员属性修饰符: private 成员属性值: 99.0
示例1结果
从结果可以看到
1.使用getFields()方法
fields数组中只包含了public修饰的成员属性,其中除了子类本身的public类型属性,也包括了父类的public类型属性。 2.使用getDeclaredField()方法报错:
Exception in thread "main" java.lang.IllegalAccessException: Class com.test.test.Demo can not access a member of class com.test.test.Person$Student with modifiers "private"
at sun.reflect.Reflection.ensureMemberAccess(Reflection.java:102)
==>对于私有的成员变量来说,要操作其属性值的话,就需要设置setAccessible(true);
field.setAccessible(true)就是让我们在反射时可以操作私有成员属性的值。
结果:fields数组中只包含了子类Student的所有成员属性,不包含父类任何类型的成员属性
示例2:--静态内部类
package com.test.test; import java.lang.reflect.Field;
import java.lang.reflect.Modifier; public class Demo2 {
/**
* Java反射获取对象成员属性,getFields()与getDeclaredFields()方法的区别
* --静态内部类
*
* @param args
* @throws IllegalAccessException
*/
public static void main(String[] args) throws IllegalAccessException { StudentInfo studentInfo = new StudentInfo();
studentInfo.setName("张三");
StudentInfo.StudyInfo studyInfo = new StudentInfo.StudyInfo("语文", "99");
studentInfo.setStudyInfo(studyInfo);
System.out.println("studentInfo = " + studentInfo); System.out.println("======getFields()======");
Field[] fields = studentInfo.getClass().getFields();
for (Field field : fields) {
System.out.println("成员属性:" + field.getName() + " 成员属性修饰符: " + Modifier.toString(field.getModifiers()) + " 成员属性值: " + field.get(studentInfo));
} System.out.println("======getDeclaredFields()======");
Field[] declaredFields = studentInfo.getClass().getDeclaredFields();
for (Field field : declaredFields) {
// 获取原来的访问控制权限
boolean accessFlag = field.isAccessible();
if (!field.isAccessible()) field.setAccessible(true);
System.out.println("成员属性:" + field.getName() + " 成员属性修饰符: " + Modifier.toString(field.getModifiers()) + " 成员属性值: " + field.get(studentInfo));
field.setAccessible(accessFlag);
}
}
}
示例2--静态内部类
示例2结果:
studentInfo = PwdFiled{name='张三', studyInfo=StudyInfo{subjectName='语文', score='99'}}
======getFields()======
成员属性:name 成员属性修饰符: public 成员属性值: 张三
======getDeclaredFields()======
成员属性:name 成员属性修饰符: public 成员属性值: 张三
成员属性:studyInfo 成员属性修饰符: private 成员属性值: StudyInfo{subjectName='语文', score='99'}
示例2结果
从结果可以看到
1.使用getFields()方法
fields数组中只包含了public修饰的成员属性。 2.使用getDeclaredField()方法
fields数组中只包含了类StudentInfo的所有成员属性
转自:https://blog.csdn.net/liujun03/article/details/81512834
Java反射获取对象成员属性,getFields()与getDeclaredFields()方法的区别的更多相关文章
- Java反射获取对象VO的属性值(通过Getter方法)
有时候,需要动态获取对象的属性值. 比如,给你一个List,要你遍历这个List的对象的属性,而这个List里的对象并不固定.比如,这次User,下次可能是Company. e.g. 这次我需要做一个 ...
- java反射获取字段的属性值,以及为字段赋值等方法
1.获取某个类的属性值 /*利用getter方法获取值(首字母大写) CjJssetDTO obj: */ String filedName = "Cj"+(i+1); Class ...
- java反射获取Object的属性和值
在看反射顺便做个笔记,目前知道的反射的Object都是要有对象的也就是实体Bean. import java.lang.reflect.Field; import java.util.ArrayLis ...
- 第五课 JAVA反射获取对象属性和方法(通过配置文件)
Service1.java package reflection; public class Service1 { public void doService1(){ System.out.print ...
- 第五课 JAVA反射获取对象属性和方法
package com.hero; import java.lang.reflect.Field; public class TestReflction5 { public static void m ...
- java 反射获取类的属性 类型 名称和值
/** * 获取属性类型(type),属性名(name),属性值(value)的map组成的list * */ private List getFiledsInfo(Object o){ Field[ ...
- 【java】java反射机制,动态获取对象的属性和对应的参数值,并属性按照字典序排序,Field.setAccessible()方法的说明【可用于微信支付 签名生成】
方法1:通过get()方法获取属性值 package com.sxd.test.controller; public class FirstCa{ private Integer num; priva ...
- Java 获取对象全部属性 包括 父类属性
今天由于业务需要,看一段数据库中的表转化成用户可以看懂的数据,也就是把一些字段比如Date用ms存的,转化为'yyyy-MM-dd'这种格式,但是由于字段太多,所以利用Java反射机制自带的BeanU ...
- Java反射学习-1 - 反射获取类的属性,方法,构造器
新建一个Person类 package cn.tx.reflect; /** * 注解初步了解 * @author Administrator * */ public class Person { p ...
随机推荐
- Android Developer -- Bluetooth篇 开发实例之一 扫描设备
第一步:声明Bluetooth Permissions <!-- 设置蓝牙访问权限 --> <uses-permission android:name="android.p ...
- 深入理解MySQL中的Redo、Undo、MVCC
http://edu.csdn.net/course/detail/3495 http://edu.csdn.net/courses/o317_a3/云计算大数据
- fuser 和 lsof
FUSER fuser功能fuser 可以显示出当前哪个程序在使用磁盘上的某个文件.挂载点.甚至网络端口,并给出程序进程的详细信息. fuser显示使用指定文件或者文件系统的进程ID.默认情况下每个文 ...
- Unitity 常用工具类
ylbtech-Unitity_C#: Unitity 常用代码 1.A,效果图返回顶部 1.B,源代码返回顶部 1,日期字符串 using System; using System.Xml; / ...
- office2010使用mathtype时,出现未找到MathPage.WLL解决方案--亲测有用
安装mathtype时,出现如下错误: 解决方案: 参考此网址中的内容:http://www.mathtype.cn/wenti/word-jianrong.html 首先需要找到在Word加载的两个 ...
- 项目笔记:导出XML和导出全部XML功能
前台代码: //导出一条Xml function btn_createXml(){ var title =$("#editButton").attr("title&quo ...
- 【AS3 Coder】任务五:Flash 2D游戏的第二春(上)
在上一节中,我们基本上已经讲完了游戏中最主要的逻辑部分,不过为了更加全面地运用Starling中的一些特性,在本节中我们将一起来看看如何实现多面板切换以及粒子效果,这两个玩意儿可是比较频繁会出现于St ...
- Java虚拟机内存分配和回收策略
1 对象优先分配在Eden区 对象优先在Eden进行分配,大多数情况下,对象在新生代Eden区进行分配.当Eden区没有足够的空间进行分配时,虚拟机会发起一次Minor GC. 新生代GC(Ninor ...
- sql 查询重复的数据
select * from yryz_role_partner where user_id in (select user_id from yryz_role_partner group by use ...
- 【前端开发】 5分钟创建 Mock Server
http://blog.csdn.net/wxqee/article/details/50165581 NOTIFY 官网文档现在已经很简约.很强大了,建议直接点击这里: Getting Starte ...