背景

在工作中,经常需要对特定对象转换成我想要的JSON对象,为了实现通用性想到用反射去实现这个过程。java反射中可用的方法有很多,如Class (反射的入口)、Method (成员方法)、Field (成员变量),而我想要实现的功能使用Field即可实现。

用法

Field是什么

Field是一个类,位于java.lang.reflect包下。在Java反射中Field类描述的是类的属性信息,功能包括:

  • 获取当前对象的成员变量的类型
  • 对成员变量重新设值

如何使用Field

如何获取Field类对象

一共有4种方法:

  • Class.getFields(): 获取类中public类型的属性,返回一个包含某些 Field 对象的数组,该数组包含此 Class 对象所表示的类或接口的所有可访问公共字段
  • getDeclaredFields(): 获取类中所有的属性(public、protected、default、private),但不包括继承的属性,返回 Field 对象的一个数组
  • getField(String name): 获取类特定的方法,name参数指定了属性的名称
  • getDeclaredField(String name): 获取类特定的方法,name参数指定了属性的名称

Field 类对象常用方法

  • 获取变量的类型:

    • Field.getType():返回这个变量的类型
    • Field.getGenericType():如果当前属性有签名属性类型就返回,否则就返回 Field.getType()
    • isEnumConstant() : 判断这个属性是否是枚举类
  • 获取成员变量的修饰符
    • Field.getModifiers()  以整数形式返回由此 Field 对象表示的字段的 Java 语言修饰符
  • 获取和修改成员变量的值

    • getName() : 获取属性的名字

    • get(Object obj) 返回指定对象obj上此 Field 表示的字段的值

    • set(Object obj, Object value) 将指定对象变量上此 Field 对象表示的字段设置为指定的新值

实践

以工作中使用的代码为举例:

//入参:request为原类型的对象,Sring[]为我想从request中保留的字段,我想要返回的类型为JSONObject
public static JSONObject convertJson(Object request, String[] arr) {try {JSONObject result = new JSONObject();if (StringUtils.isNotBlank(request.toString())) {//第一步:获取操作类Class clazz = request.getClass();//第二步:获取此类的所有的公共(public)的字段,返回 Field 对象的一个数组Field[] fields = clazz.getFields();for (Field field : fields) {//第三步:获取字段的名称String fieldValue = field.getName();if(ArrayUtils.contains(arr,fieldValue)){//第四步:将字段名称和值进行存储result.put(fieldValue,field.get(request));}}}return result;} catch (Exception ex) {logger.error(ex.getMessage());return null;}
}

常见错误

  • set(Object obj, Object value) 时,新value和原value的类型不一致导致,如下:无法转换类型导致的 java.lang.IllegalArgumentException(注意:反射获取或者修改一个变量的值时,编译器不会进行自动装/拆箱,所以int 和Integer需手动修改
  • set(Object obj, Object value) 时,修改 final类型的变量导致的 IllegalAccessException。由于 Field 继承自 AccessibleObject , 我们可以使用 AccessibleObject.setAccessible() 方法告诉安全机制,这个变量可以访问即可解决,如field.setAccessible(true)。
  • getField(String name) 或getFields() 获取非 public 的变量,编译器会报 java.lang.NoSuchFieldException 错。

java反射--Field用法实践相关推荐

  1. java反射field_java反射field用法

    我们在前面的文章中学习了java反射机制是什么的问题,相信大家对反射机制有了全面的理解.在java中使用反射机制,会提高程序的灵活性和扩展性,还能节省资源,因此在java编程中使用好反射是重要的.今天 ...

  2. java反射field和method的顺序问题

    最近在有思考到序列化性能优化的问题,关于java反射field和method的顺序问题,这里有详细的讨论http://stackoverflow.com/questions/5001172/java- ...

  3. Java反射 field

    Java反射 field 获取字节码文件对象 Class c = Class.forName("fieldtest.Student"); 通过无参构造方法创建对象obj Const ...

  4. Java反射机制应用实践

    引言 Java反射机制是一个非常强大的功能,在很多大型项目比如Spring, Mybatis都可以看见反射的身影.通过反射机制我们可以在运行期间获取对象的类型信息,利用这一特性我们可以实现工厂模式和代 ...

  5. java 反射 field get方法_JAVA学习之反射getDeclaredField()方法与getField()方法的区别

    在使用反射的时候,常用到的几个方法老是傻傻的分不清楚是干吗的,功能差不多的啊, 比如: Class.getFields(), Class.getField(String), Class.getDecl ...

  6. java field类,Java反射—Field类使用

    Field作为反射中对应类或对象中的域或者叫做属性的操作类,除了我前一篇文章中的得到名字和类型等,Field的作用不限于此. Java SE 8的Docs这样说:A Field provides in ...

  7. java反射getmethod用法_Java反射之 getMethod() 与invoke的使用

    1.forName 方法 forName是一个静态方法,其作用:通过调用来获取类名对应的Class对象,同时将Class对象加载进来. 如果将类名保存在字符串(如xml)中,就可以在程序运行时,动态调 ...

  8. java 反射 field.set_java从入门到精髓 - 反射Field

    importjava.lang.reflect.Field;publicclassFieldTest {inti;publicfloatf;protectedbooleanb;privateStrin ...

  9. 大家都说 Java 反射效率低,你知道原因在哪里么

    [这是 ZY 第 17 篇原创技术文章] 预备知识 了解 Java 反射基本用法 看完本文可以达到什么程度 了解 Java 反射原理及 Java 反射效率低的原因 文章概览 我们在 Java 开发中, ...

  10. dwr java有返回值但是js获取不到返回值_一探究竟:Java反射效率低的原因到底在哪?...

    预备知识 了解 Java 反射基本用法 看完本文可以达到什么程度 了解 Java 反射原理及 Java 反射效率低的原因 文章概览 我们在 Java 开发中,难免会接触到反射,而在一些框架中,反射的运 ...

最新文章

  1. linux 内核信号量与用户态信号量(system v,信号量在Linux多线程机制中的应用
  2. Application Virtualization 4.5 部署之(三)(
  3. boost::set_intersection相关的测试程序
  4. 信息学奥赛一本通(1025:保留12位小数的浮点数)
  5. C++ string类的说明
  6. 2.15.9.menuconfig的实验学习思路
  7. js 中的 __proto__
  8. 获取本周的周一和周日
  9. python怎么打开excel文件并处理_Python利用openpyxl处理Excel文件(Excel文件基本操作)...
  10. maven install过程
  11. Thrift RPC实战(七) 基于zookeeper和thrift的RPC服务发布订阅
  12. 关于zigbee协议栈各层的系统分析
  13. 《Using OpenRefine》翻译~15
  14. CH Dream(侠客行)
  15. 利用Pygame制作跳跃的小球游戏
  16. 如何做好积分商城运营?
  17. android快速仿花椒,映客直播上下滑动切换直播间
  18. 项目管理经验谈- mindjet思维导图的使用
  19. elementui表格如何自定义表头内容,让表头变得更美观
  20. word双引号间距大_解决Word 2013的双引号尴尬

热门文章

  1. 亲测美团打车聚合服务:要做出行服务的天猫?
  2. matlab生成Z为常数的.grd格式数据
  3. JavaScript防流量劫持-前端安全
  4. 搜狗拼音输入发-自定义短语记录
  5. java unexpected token解决方法
  6. 目标检测--轻量级网络(截至2022-04-21)
  7. 分享一些个人的抢票过程
  8. 音乐铃声解析提取API接口
  9. 像素值/DN值/数字量化值
  10. 华硕无线网卡测试软件,华硕 AiMesh WiFi系统 无线回程测试