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()方法的区别的更多相关文章

  1. Java反射获取对象VO的属性值(通过Getter方法)

    有时候,需要动态获取对象的属性值. 比如,给你一个List,要你遍历这个List的对象的属性,而这个List里的对象并不固定.比如,这次User,下次可能是Company. e.g. 这次我需要做一个 ...

  2. java反射获取字段的属性值,以及为字段赋值等方法

    1.获取某个类的属性值 /*利用getter方法获取值(首字母大写) CjJssetDTO obj: */ String filedName = "Cj"+(i+1); Class ...

  3. java反射获取Object的属性和值

    在看反射顺便做个笔记,目前知道的反射的Object都是要有对象的也就是实体Bean. import java.lang.reflect.Field; import java.util.ArrayLis ...

  4. 第五课 JAVA反射获取对象属性和方法(通过配置文件)

    Service1.java package reflection; public class Service1 { public void doService1(){ System.out.print ...

  5. 第五课 JAVA反射获取对象属性和方法

    package com.hero; import java.lang.reflect.Field; public class TestReflction5 { public static void m ...

  6. java 反射获取类的属性 类型 名称和值

    /** * 获取属性类型(type),属性名(name),属性值(value)的map组成的list * */ private List getFiledsInfo(Object o){ Field[ ...

  7. 【java】java反射机制,动态获取对象的属性和对应的参数值,并属性按照字典序排序,Field.setAccessible()方法的说明【可用于微信支付 签名生成】

    方法1:通过get()方法获取属性值 package com.sxd.test.controller; public class FirstCa{ private Integer num; priva ...

  8. Java 获取对象全部属性 包括 父类属性

    今天由于业务需要,看一段数据库中的表转化成用户可以看懂的数据,也就是把一些字段比如Date用ms存的,转化为'yyyy-MM-dd'这种格式,但是由于字段太多,所以利用Java反射机制自带的BeanU ...

  9. Java反射学习-1 - 反射获取类的属性,方法,构造器

    新建一个Person类 package cn.tx.reflect; /** * 注解初步了解 * @author Administrator * */ public class Person { p ...

随机推荐

  1. Android Developer -- Bluetooth篇 开发实例之一 扫描设备

    第一步:声明Bluetooth Permissions <!-- 设置蓝牙访问权限 --> <uses-permission android:name="android.p ...

  2. 深入理解MySQL中的Redo、Undo、MVCC

    http://edu.csdn.net/course/detail/3495 http://edu.csdn.net/courses/o317_a3/云计算大数据

  3. fuser 和 lsof

    FUSER fuser功能fuser 可以显示出当前哪个程序在使用磁盘上的某个文件.挂载点.甚至网络端口,并给出程序进程的详细信息. fuser显示使用指定文件或者文件系统的进程ID.默认情况下每个文 ...

  4. Unitity 常用工具类

    ylbtech-Unitity_C#: Unitity 常用代码 1.A,效果图返回顶部   1.B,源代码返回顶部 1,日期字符串 using System; using System.Xml; / ...

  5. office2010使用mathtype时,出现未找到MathPage.WLL解决方案--亲测有用

    安装mathtype时,出现如下错误: 解决方案: 参考此网址中的内容:http://www.mathtype.cn/wenti/word-jianrong.html 首先需要找到在Word加载的两个 ...

  6. 项目笔记:导出XML和导出全部XML功能

    前台代码: //导出一条Xml function btn_createXml(){ var title =$("#editButton").attr("title&quo ...

  7. 【AS3 Coder】任务五:Flash 2D游戏的第二春(上)

    在上一节中,我们基本上已经讲完了游戏中最主要的逻辑部分,不过为了更加全面地运用Starling中的一些特性,在本节中我们将一起来看看如何实现多面板切换以及粒子效果,这两个玩意儿可是比较频繁会出现于St ...

  8. Java虚拟机内存分配和回收策略

    1 对象优先分配在Eden区 对象优先在Eden进行分配,大多数情况下,对象在新生代Eden区进行分配.当Eden区没有足够的空间进行分配时,虚拟机会发起一次Minor GC. 新生代GC(Ninor ...

  9. sql 查询重复的数据

    select * from yryz_role_partner where user_id in (select user_id from yryz_role_partner group by use ...

  10. 【前端开发】 5分钟创建 Mock Server

    http://blog.csdn.net/wxqee/article/details/50165581 NOTIFY 官网文档现在已经很简约.很强大了,建议直接点击这里: Getting Starte ...