为了下面测试先建对象

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相关推荐

  1. java反射获取字段的顺序6_反射之获取字段

    1 public classDemo12{2 3 /* 4 对任意一个Object实例,只要我们获取了它的Class,就可以获取它的一切信息5 Class类提供了以下几个方法来获取字段6 7 Fiel ...

  2. java 反射获取父类的字段_java反射获取父类和子类字段值、赋值

    这里将告诉您java反射获取父类和子类字段值.赋值,具体操作过程:java反射获取字段值.赋值 import org.springframework.util.ReflectionUtils; imp ...

  3. java反射获取注解id,通过反射获取注解(Annotation)

    以下实例,定义一个注解.通过反射获取. 主要功能:为所注解过的参数和方法附加一些信息可以获取. 定义注解. import java.lang.annotation.*; @Retention(Rete ...

  4. java反射字段6,java反射判断字段类型

    java动态获取字段类型,深入理解 Java 虚拟机 Java内存区域与内存溢出异常,java反射判断字段类型,java动态添加字段原理 利用java反射获取泛型类的类型参数具体类对象_计算机软件及应 ...

  5. Java 反射 ---- 获取成员变量构造函数信息

    这一章我们通过Java的反射获取某个类的成员变量构造函数信息,话不多说直接上代码. 先贴工具类获取类信息的方法: package com.blockChain;import java.lang.ref ...

  6. Java反射--获取类方法的泛型返回或泛型参数

    Java反射--获取类方法的泛型返回或泛型参数 一.测试类 public class Test02 {public void parameterTest(Map<Integer, Dog> ...

  7. Android利用Java反射获取用户手机的rom定制系统及版本,EMUI,MIUI,ColorOS,FunthouchOS等

    Android利用Java反射获取用户手机的rom定制系统版本及版本号,EMUI,MIUI,ColorOS,FunthouchOS等 前言 正文 结语 前言 现在手机厂商都推出了自己的基于Androi ...

  8. JAVA反射系列之Field,java.lang.reflect.Field使用获取方法。

    2019独角兽企业重金招聘Python工程师标准>>> 首先必须明一点 Field类主要是用来辅助获取和操作类的属性的! 1.怎么通过反射获取类的属性 先来看JDK提供的方法有如下几 ...

  9. Java 反射获取Field

    反射获取Field :成员变量 设置值 void set(0bject obj, object value) 获取值 get(object obj) 忽略访问权限修饰符的安全检查 setAccessi ...

最新文章

  1. 欧盟剑指科技巨头,意欲上调税款
  2. python中struct_Python的Struct模块,用法以及个人理解
  3. XCode 项目配置说明
  4. CSS三种写法的优先级
  5. C++11:委托构造函数
  6. 最长上升子序列(LIS)长度
  7. 【51单片机快速入门指南】4.3.4: MPU6050使用Madgwick AHRS算法实现六轴姿态融合获取四元数、欧拉角
  8. int 最大值_十行代码说清楚:leetcode 队列的最大值
  9. linux gdb 导出到文件怎么打开,GDB基本命令从打开文件到调试结束的教程
  10. 一条SQL语句在MySQL中执行过程全解析
  11. 条码打印软件如何批量打印快递单
  12. Linux使用crond定时任务详解,定期同步服务器时间。
  13. Android 查询局域网内所有ip和mac地址
  14. Calendar 根据指定日期 获取月的第几周
  15. EasyRTMP Android安卓手机直播推流摄像头偏暗的问题解决
  16. ffmpeg编解码格式
  17. mysql云化方案_云原生下,如何实现高可用的MySQL?
  18. ups服务器未能登录,UPS电源常见故障大全
  19. 利用opencv拼接图像视频摄像头进行录像
  20. 23 种设计模式的有趣见解

热门文章

  1. 计算机基础知识大全剪切,基础篇:剪切粘贴与复制粘贴的介绍
  2. 分享一些舒服的英语表达,更有利于成交!
  3. UART项目验证(二) spec阅读
  4. QQ浏览器劫持html5的视频video标签的问题(怎么解决?)
  5. 关于区块链及其与物联网的集成-挑战与机遇
  6. Python Matplotlib中坐标轴标题中各种特殊符号的显示 转义字符全集,编写数学表达式
  7. sqlh和mysql的区别_HSQL和MySQL的區別
  8. layabox笔记 目录结构
  9. 如何更好的利用区块链API
  10. 985毕业的他裸辞都找不到工作,干了五年Android开发了,你觉得裸辞需不需要“冷静期”?