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 ...
随机推荐
- iOS静态库打包
当了三年多程序员,第一次写随便,说来有些惭愧.想成为一个优秀的程序员,分析,思考,总结并且做记录是必不可少的,今天先从简单的命令总结记起.好了,废话不多说了,Let's start our games ...
- Android的file文件操作详解
Android的file文件操作详解 android的文件操作要有权限: 判断SD卡是否插入 Environment.getExternalStorageState().equals( android ...
- Word中如何让两个图片垂直居中对齐
如图,两个图片都剧终了,大小也一致,但是发现没有对齐,那是因为需要设置(矩阵框住的)缩进,让两个在一起,上下对齐.
- Android-Adapter-View复用机制
前言 相信Android开发者对ListView不会陌生,使用ListView需要设置相应的Adapter才能展示数据.Adapter到底是什么东西?让我们来一探究竟. Adapter p1.png ...
- ElasticSearch 相关性
1.相关性 ElasticSearch检索结果是按照相关性倒序排列的,相关性是什么,相关性又是如何计算的?每个文档都有相关性评分,用一个正浮点数字段 _score 来表示 . _score 的评分越高 ...
- [Java] 实验8
[Java] 实验7參考代码,代码已更新.感兴趣的同学能够去学习. 1. default package问题可參考实验6 2. for, if, while等.后面包括多条语句时,须要用花括号括起来 ...
- python获取输入参数
python获取输入参数 学习了:https://www.cnblogs.com/angelatian/p/5832448.html import sys模块: len(sys.argv)参数个数 s ...
- 关于批量插入数据之我见(100万级别的数据,mysql)
因前段时间去面试,问到怎样高效向数据库插入10万条记录,之前没处理过类似问题.也没看过相关资料,结果没答上来,今天就查了些资料.总结出三种方法: 測试数据库为mysql!!! 方法一: public ...
- Linux Java开发环境
一.旧版本JDK卸载 1.卸载系统自带JDK版本 #rpm -qa|grep gcj 查看到如下信息,如图所示: 进行卸载默认安装JDK: #rpm -e --nodeps java-1.4.2- ...
- 解决safari中iframe嵌入不能滚动的问题
做完了个webapp之后,开发的时候一直在浏览器上模拟ios,没有任何问题,谁知交差的时候,客户告知在ios浏览器中不能滚动嵌入的iframe,直接就滚动外层整个document了,你知道docume ...