Java反射中Field用于获取某个类的属性或该属性的属性值

一:如何通过Field反射获取类的属性

Field提供如下几种方法:

:1:Class.getDeclaredField(String name);

返回一个 Field 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明字段(包括私有成员)。

2:Class.getDeclaredFields();

返回 Field 对象的一个数组,该数组包含此 Class 对象所表示的类或接口所声明的所有字段(包括私有成员)。

3:Class.getField(String name);

返回一个 Field 对象,它反映此 Class 对象所表示的类或接口的指定公共成员字段。

4:Class.getFields();

返回一个包含某些 Field 对象的数组,该数组包含此 Class 对象所表示的类或接口的所有可访问公共字段。

下面一个例子说明如何通过Field反射获取类中的属性

我们先定义一个普通类Person

包含三个属性 公有name 私有age、sex

  1. package com.mao.test;
  2. public class Person
  3. {
  4. public String name;
  5. private Integer age;
  6. private String sex;
  7. //省略所有属性的set、get方法

下面开始通过Field反射的各方法访问属性

  1. package com.mao.test;
  2. import java.lang.reflect.Field;
  3. public class Test
  4. {
  5. public static void main(String[]args) throws NoSuchFieldException, SecurityException
  6. {
  7. Person person =new Person();
  8. //通过Class.getDeclaredField(String name)获取类或接口的指定已声明字段。
  9. Field f1=person.getClass().getDeclaredField("name");
  10. System.out.println("-----Class.getDeclaredField(String name)用法-------");
  11. System.out.println(f1);
  12. System.out.println("-----Class.getDeclaredFields()用法-------");
  13. //通过Class.getDeclaredFields()获取类或接口的指定已声明字段。
  14. Field []f2=person.getClass().getDeclaredFields();
  15. for(Field field:f2)
  16. {
  17. System.out.println(field);
  18. }
  19. System.out.println("-----Class.getField(String name)用法-------");
  20. //通过Class.getField(String name)返回一个类或接口的指定公共成员字段,私有成员报错。
  21. Field f3=person.getClass().getField("name");
  22. System.out.println(f3);
  23. //如果获取age属性(私有成员) 则会报错
  24. //Field f3=person.getClass().getField("name");
  25. System.out.println("-----Class.getFields()用法-------");
  26. //通过Class.getField(),返回 Class 对象所表示的类或接口的所有可访问公共字段。
  27. Field []f4=person.getClass().getFields();
  28. for(Field fields:f4)
  29. {
  30. //因为只有name属性为共有,因此只能遍历出name属性
  31. System.out.println(fields);
  32. }
  33. }
  34. }

通过上面程序也可以发现Class.getField(String
name)和Class.getFields()都只能返回公有属性,如果访问私有属性就会报错java.lang.NoSuchFieldException。

运行结果:

  1. -----Class.getDeclaredField(String name)用法-------
  2. public java.lang.String com.mao.test.Person.name
  3. -----Class.getDeclaredFields()用法-------
  4. public java.lang.String com.mao.test.Person.name
  5. private java.lang.Integer com.mao.test.Person.age
  6. private java.lang.String com.mao.test.Person.sex
  7. -----Class.getField(String name)用法-------
  8. public java.lang.String com.mao.test.Person.name
  9. -----Class.getFields()用法-------
  10. public java.lang.String com.mao.test.Person.name

二:获取属性的属性值并修改属性值

获取属性的值用get(Object obj)的方法,但是获取私有属性的时候必须先设置Accessible为true,然后才能获取。

下面咱们获取Person各属性的属性值并将姓名属性值修改

Test.java

  1. package com.mao.test;
  2. import java.lang.reflect.Field;
  3. public class Test
  4. {
  5. public static void main(String[]args) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException
  6. {
  7. Person person =new Person();
  8. person.setName("VipMao");
  9. person.setAge(24);
  10. person.setSex("男");
  11. //通过Class.getDeclaredField(String name)获取类或接口的指定属性值。
  12. Field f1=person.getClass().getDeclaredField("name");
  13. System.out.println("-----Class.getDeclaredField(String name)用法-------");
  14. System.out.println(f1.get(person));
  15. System.out.println("-----Class.getDeclaredFields()用法-------");
  16. //通过Class.getDeclaredFields()获取类或接口的指定属性值。
  17. Field []f2=person.getClass().getDeclaredFields();
  18. for(Field field:f2)
  19. {
  20. field.setAccessible(true);
  21. System.out.println(field.get(person));
  22. }
  23. //修改属性值
  24. System.out.println("----修改name属性------");
  25. f1.set(person, "Maoge");
  26. //修改后再遍历各属性的值
  27. Field []f3=person.getClass().getDeclaredFields();
  28. for(Field fields:f3)
  29. {
  30. fields.setAccessible(true);
  31. System.out.println(fields.get(person));
  32. }
  33. }
  34. }

从上面程序我们得知,通过get(Object obj)获取属性的值,通过set(Object obj,value)重新设置新的属性值,并且当我们需要获取私有属性的属性值得时候,我们必须设置Accessible为true,然后才能获取。

运行结果:

    1. -----Class.getDeclaredField(String name)用法-------
    2. VipMao
    3. -----遍历属性值-------
    4. VipMao
    5. 24
    6. ----修改name属性后再遍历属性值------
    7. Maoge
    8. 24

最新文章

  1. AE唯一值符号化的流程以及过程
  2. Lucene查询索引(分页)
  3. UI1_UITableViewHomeWork
  4. 剑指OFFER之重建二叉树(九度OJ1385)
  5. Java发送邮件(带附件)
  6. HDU 3308 LCIS 线段树区间更新
  7. 4 hbase表结构 + hbase集群架构及表存储机制
  8. .NET 基础 一步步 一幕幕[面向对象之堆、栈、引用类型、值类型]
  9. 第一章 用HTML5中的结构元素构建网站
  10. javascript是什么,可以做什么?
  11. "每日一道面试题".net托管堆是否会存在内存泄漏的情况
  12. [ 随手记 5 ] C/C++ 继承
  13. Linq:使用Take和Skip实现分页
  14. Android中的task和stack
  15. LinkedHashMap
  16. codeblocks 输入、输出文件的位置
  17. Linux 10字符串命令病毒的处理记录
  18. Caused by: java.lang.ClassNotFoundException: Cannot find class解决办法
  19. elasticsearch配置文件详解
  20. 八、springboot(五)配置定时器

热门文章

  1. [转] 在vue中使用SockJS实现webSocket通信
  2. 使用spyder3调试python程序
  3. 元类相关(type & metaclass)
  4. mvc “System.NullReferenceException”类型的异常在 App_Web_zo44wdaq.dll 中发生,但未在用户代码中进行处理 其他信息: 未将对象引用设置到对象的实例。
  5. Baum Welch估计HMM参数实例
  6. Leetcode 466.统计重复个数
  7. [python篇][其他] python博客学习汇总
  8. 【Luogu】P3332K大数查询(树套树)
  9. NYOJ——301递推求值(矩阵快速幂)
  10. [luoguP1640] [SCOI2010]连续攻击游戏(二分图最大匹配)