java 反射获取字段field
为了下面测试先建对象
package com.sakyoka.test.person;import java.lang.reflect.Field;public class Person {private String name;private Integer age;private Integer sex;public static String testStaticName;public String testName;public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}public Integer getSex() {return sex;}public void setSex(Integer sex) {this.sex = sex;}
}
一、getDeclaredField、getField区别
测试例子1:
public static void main(String[] args) {Class<?> cls = Person.class;try {Field field = cls.getField("testStaticName");System.out.println(field.getName());} catch (Exception e) {e.printStackTrace();}try {Field field = cls.getField("name");System.out.println(field.getName());} catch (Exception e) {e.printStackTrace();} }
输出:
testStaticName
java.lang.NoSuchFieldException: name
at java.lang.Class.getField(Class.java:1703)
at com.sakyoka.test.person.Person.main(Person.java:55)
结果:getField只能获取public字段,获取不到私有字段
测试例子2:
public static void main(String[] args) {Class<?> cls = Person.class;try {Field field = cls.getDeclaredField("testStaticName");System.out.println(field.getName());} catch (Exception e) {e.printStackTrace();}try {Field field = cls.getDeclaredField("name");System.out.println(field.getName());} catch (Exception e) {e.printStackTrace();} }
输出:
testStaticName
name
结果:getDeclaredField即可获取公有public字段也可以获取private私有字段
二、getDeclaredFields、getFields区别
测试例子
public static void main(String[] args) {Class<?> cls = Person.class;Field[] fields = cls.getFields();for (Field field:fields) {System.out.println("fieldName:" + field.getName());}System.out.println("----------------");Field[] declaredFields = cls.getDeclaredFields();for (Field field:declaredFields) {System.out.println("fieldName:" + field.getName());}}
输出:
fieldName:testStaticName
fieldName:testName
----------------
fieldName:name
fieldName:age
fieldName:sex
fieldName:testStaticName
fieldName:testName
结果:可以看到getFields只能获取public字段集合,getDeclaredFields获取当前类所有字段。
其实getFields 就是getField的集合,getDeclaredFields就是getDeclaredField集合
三、父类字段获取
当一个类有集成的父类时候,那么父类字段怎么获取呢
定义一个学生继承上面的类试试
package com.sakyoka.test.person;import java.lang.reflect.Field;public class Student extends Person{private String schoolName;private String grade;public String testNameStudent;public String getSchoolName() {return schoolName;}public void setSchoolName(String schoolName) {this.schoolName = schoolName;}public String getGrade() {return grade;}public void setGrade(String grade) {this.grade = grade;}
}
测试例子
public static void main(String[] args) {Class<?> cls = Student.class;Field[] fields = cls.getFields();for (Field field:fields) {System.out.println("fieldName:" + field.getName());}System.out.println("----------------");Field[] declaredFields = cls.getDeclaredFields();for (Field field:declaredFields) {System.out.println("fieldName:" + field.getName());}}
输出:
fieldName:testStaticName
fieldName:testName
----------------
fieldName:schoolName
fieldName:grade
结果:可以看到getFields可以获取本身及父类的public字段而getDeclaredFields仅获取到本身的私有字段。
那如果获取父类字段呢
通过getSuperclass()
public static List<Field> getAllFields(Class<?> clazz){Field[] fields = clazz.getDeclaredFields();List<Field> fieldList = new ArrayList<Field>();fieldList.addAll(Arrays.asList(fields));Class<?> superClazz = clazz.getSuperclass();while (superClazz != null){fieldList.addAll(new ArrayList<>(Arrays.asList(superClazz.getDeclaredFields())));superClazz = superClazz.getSuperclass();} return fieldList;}
测试例子
public static void main(String[] args) {Class<?> cls = Student.class;List<Field> declaredFields = getAllFields(cls);for (Field field:declaredFields) {System.out.println("fieldName:" + field.getName());}}
输出:
fieldName:schoolName
fieldName:grade
fieldName:testNameStudent
fieldName:name
fieldName:age
fieldName:sex
fieldName:testStaticName
fieldName:testName
结果:通过getSuperclass 获取到父类的class从而获取父类字段
好像漏了一个例子,当有父类时候getField、getDeclaredField又是会怎么?
其实,通过例子可以猜测到getField可以获取到本身及父类的字段,而getDeclaredField仅获取自身字段,如果要获取父类的字段还得通过getSuperclass再getDeclaredField才能获取。
好了,关于获取field就这么多。
总结
1、getDeclaredField只能获取当前类的私有及公有字段,想要获取父类私有字段只能通过getSuperclass获取
2、getField能获取本身及父类的公有字段
3、getDeclaredFields只能获取当前类所有字段集合不包括父类字段,想要获取父类私有字段只能通过getSuperclass获取
4、getFields能获取本身及父类公有字段集合
java 反射获取字段field相关推荐
- java反射获取字段的顺序6_反射之获取字段
1 public classDemo12{2 3 /* 4 对任意一个Object实例,只要我们获取了它的Class,就可以获取它的一切信息5 Class类提供了以下几个方法来获取字段6 7 Fiel ...
- java 反射获取父类的字段_java反射获取父类和子类字段值、赋值
这里将告诉您java反射获取父类和子类字段值.赋值,具体操作过程:java反射获取字段值.赋值 import org.springframework.util.ReflectionUtils; imp ...
- java反射获取注解id,通过反射获取注解(Annotation)
以下实例,定义一个注解.通过反射获取. 主要功能:为所注解过的参数和方法附加一些信息可以获取. 定义注解. import java.lang.annotation.*; @Retention(Rete ...
- java反射字段6,java反射判断字段类型
java动态获取字段类型,深入理解 Java 虚拟机 Java内存区域与内存溢出异常,java反射判断字段类型,java动态添加字段原理 利用java反射获取泛型类的类型参数具体类对象_计算机软件及应 ...
- Java 反射 ---- 获取成员变量构造函数信息
这一章我们通过Java的反射获取某个类的成员变量构造函数信息,话不多说直接上代码. 先贴工具类获取类信息的方法: package com.blockChain;import java.lang.ref ...
- Java反射--获取类方法的泛型返回或泛型参数
Java反射--获取类方法的泛型返回或泛型参数 一.测试类 public class Test02 {public void parameterTest(Map<Integer, Dog> ...
- Android利用Java反射获取用户手机的rom定制系统及版本,EMUI,MIUI,ColorOS,FunthouchOS等
Android利用Java反射获取用户手机的rom定制系统版本及版本号,EMUI,MIUI,ColorOS,FunthouchOS等 前言 正文 结语 前言 现在手机厂商都推出了自己的基于Androi ...
- JAVA反射系列之Field,java.lang.reflect.Field使用获取方法。
2019独角兽企业重金招聘Python工程师标准>>> 首先必须明一点 Field类主要是用来辅助获取和操作类的属性的! 1.怎么通过反射获取类的属性 先来看JDK提供的方法有如下几 ...
- Java 反射获取Field
反射获取Field :成员变量 设置值 void set(0bject obj, object value) 获取值 get(object obj) 忽略访问权限修饰符的安全检查 setAccessi ...
最新文章
- 欧盟剑指科技巨头,意欲上调税款
- python中struct_Python的Struct模块,用法以及个人理解
- XCode 项目配置说明
- CSS三种写法的优先级
- C++11:委托构造函数
- 最长上升子序列(LIS)长度
- 【51单片机快速入门指南】4.3.4: MPU6050使用Madgwick AHRS算法实现六轴姿态融合获取四元数、欧拉角
- int 最大值_十行代码说清楚:leetcode 队列的最大值
- linux gdb 导出到文件怎么打开,GDB基本命令从打开文件到调试结束的教程
- 一条SQL语句在MySQL中执行过程全解析
- 条码打印软件如何批量打印快递单
- Linux使用crond定时任务详解,定期同步服务器时间。
- Android 查询局域网内所有ip和mac地址
- Calendar 根据指定日期 获取月的第几周
- EasyRTMP Android安卓手机直播推流摄像头偏暗的问题解决
- ffmpeg编解码格式
- mysql云化方案_云原生下,如何实现高可用的MySQL?
- ups服务器未能登录,UPS电源常见故障大全
- 利用opencv拼接图像视频摄像头进行录像
- 23 种设计模式的有趣见解
热门文章
- 计算机基础知识大全剪切,基础篇:剪切粘贴与复制粘贴的介绍
- 分享一些舒服的英语表达,更有利于成交!
- UART项目验证(二) spec阅读
- QQ浏览器劫持html5的视频video标签的问题(怎么解决?)
- 关于区块链及其与物联网的集成-挑战与机遇
- Python Matplotlib中坐标轴标题中各种特殊符号的显示 转义字符全集,编写数学表达式
- sqlh和mysql的区别_HSQL和MySQL的區別
- layabox笔记 目录结构
- 如何更好的利用区块链API
- 985毕业的他裸辞都找不到工作,干了五年Android开发了,你觉得裸辞需不需要“冷静期”?