java反射--Field用法实践
背景
在工作中,经常需要对特定对象转换成我想要的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用法实践相关推荐
- java反射field_java反射field用法
我们在前面的文章中学习了java反射机制是什么的问题,相信大家对反射机制有了全面的理解.在java中使用反射机制,会提高程序的灵活性和扩展性,还能节省资源,因此在java编程中使用好反射是重要的.今天 ...
- java反射field和method的顺序问题
最近在有思考到序列化性能优化的问题,关于java反射field和method的顺序问题,这里有详细的讨论http://stackoverflow.com/questions/5001172/java- ...
- Java反射 field
Java反射 field 获取字节码文件对象 Class c = Class.forName("fieldtest.Student"); 通过无参构造方法创建对象obj Const ...
- Java反射机制应用实践
引言 Java反射机制是一个非常强大的功能,在很多大型项目比如Spring, Mybatis都可以看见反射的身影.通过反射机制我们可以在运行期间获取对象的类型信息,利用这一特性我们可以实现工厂模式和代 ...
- java 反射 field get方法_JAVA学习之反射getDeclaredField()方法与getField()方法的区别
在使用反射的时候,常用到的几个方法老是傻傻的分不清楚是干吗的,功能差不多的啊, 比如: Class.getFields(), Class.getField(String), Class.getDecl ...
- java field类,Java反射—Field类使用
Field作为反射中对应类或对象中的域或者叫做属性的操作类,除了我前一篇文章中的得到名字和类型等,Field的作用不限于此. Java SE 8的Docs这样说:A Field provides in ...
- java反射getmethod用法_Java反射之 getMethod() 与invoke的使用
1.forName 方法 forName是一个静态方法,其作用:通过调用来获取类名对应的Class对象,同时将Class对象加载进来. 如果将类名保存在字符串(如xml)中,就可以在程序运行时,动态调 ...
- java 反射 field.set_java从入门到精髓 - 反射Field
importjava.lang.reflect.Field;publicclassFieldTest {inti;publicfloatf;protectedbooleanb;privateStrin ...
- 大家都说 Java 反射效率低,你知道原因在哪里么
[这是 ZY 第 17 篇原创技术文章] 预备知识 了解 Java 反射基本用法 看完本文可以达到什么程度 了解 Java 反射原理及 Java 反射效率低的原因 文章概览 我们在 Java 开发中, ...
- dwr java有返回值但是js获取不到返回值_一探究竟:Java反射效率低的原因到底在哪?...
预备知识 了解 Java 反射基本用法 看完本文可以达到什么程度 了解 Java 反射原理及 Java 反射效率低的原因 文章概览 我们在 Java 开发中,难免会接触到反射,而在一些框架中,反射的运 ...
最新文章
- linux 内核信号量与用户态信号量(system v,信号量在Linux多线程机制中的应用
- Application Virtualization 4.5 部署之(三)(
- boost::set_intersection相关的测试程序
- 信息学奥赛一本通(1025:保留12位小数的浮点数)
- C++ string类的说明
- 2.15.9.menuconfig的实验学习思路
- js 中的 __proto__
- 获取本周的周一和周日
- python怎么打开excel文件并处理_Python利用openpyxl处理Excel文件(Excel文件基本操作)...
- maven install过程
- Thrift RPC实战(七) 基于zookeeper和thrift的RPC服务发布订阅
- 关于zigbee协议栈各层的系统分析
- 《Using OpenRefine》翻译~15
- CH Dream(侠客行)
- 利用Pygame制作跳跃的小球游戏
- 如何做好积分商城运营?
- android快速仿花椒,映客直播上下滑动切换直播间
- 项目管理经验谈- mindjet思维导图的使用
- elementui表格如何自定义表头内容,让表头变得更美观
- word双引号间距大_解决Word 2013的双引号尴尬