# Reflect 通过反射获取自定义注解值给另外一个对象赋值
-
## 一、大致介绍
```
1、今天刚完成这么一个功能模块,需求场景是这样的,我们需要对接许多银行的接口,我们解析银行XML报文后,根据每个银行每个接口我们会解析得到很多BankDTO;
2、然后我们需要在BankDTO挑出一些必要的字段放到另外一个 ResultDTO 中去,然后将 ResultDTO 的数据入库处理;
3、而且最关键的是,每个银行的字段五花八门,我们根本没办法统一字段,最初的办法我们是对每个 BankDTO 写了一个转换类转成 ResultDTO;
4、但是随着接入的银行越来越多了,开发效率也就慢慢的降下来了,然而我就在思考如何优化这个字段转换来转换去的笨重方法;
5、经过辗转反侧的思考,最终自己定义一个注解类,然后将这些注解安插在BankDTO上,而我们需要做的事情就是反射获取注解值然后给ResultDTO赋值即可;
6、原理就是这么简单,这样写好之后,银行一多,开发人员不够,我们找些不会开发的人员只要告诉他们如何写 BankDTO 对象即可,如何映射字段值即可,最后提交代码就搞定了;
7、而我在这里主要将一些类贴出来仅供大家参考,如果这种思路在大家工作中用得着的话,相信稍微复用我这思路,功能很快就能水到渠成;
```
## 二、实现步骤
### 2.1 反射工具类,参考网上代码做了稍微调整,整理成符合自己业务逻辑的公用工具类
```
package com.springms.cloud.reflect.util;
import org.slf4j.LoggerFactory;
import java.io.File;
import java.io.IOException;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.net.URL;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Enumeration;
import java.util.List;
/**
* 反射工具类。
*
* @author hmilyylimh
*
* @version 0.0.1
*
* @date 2017/10/24
*/
public class ReflectionUtil {
private static final org.slf4j.Logger Logger = LoggerFactory.getLogger(ReflectionUtil.class);
/**
* 循环向上转型, 获取对象的 DeclaredField。
*
* @param object : 子类对象,也就是实现类对象;
* @param fieldName : 父类中的属性名;
* @return 父类中的属性对象
*/
public static Field getDeclaredField(Object object, String fieldName) {
Field field = null;
Class<?> clazz = object.getClass();
for (; clazz != Object.class; clazz = clazz.getSuperclass()) {
try {
field = clazz.getDeclaredField(fieldName);
return field;
} catch (Exception e) {
// 这里甚么都不要做!并且这里的异常必须这样写,不能抛出去。
// 如果这里的异常打印或者往外抛,则就不会执行clazz = clazz.getSuperclass(),最后就不会进入到父类中了
// Logger.error("循环向上转型, 获取对象的 DeclaredField 异常, fieldName: {}, object: {}, \n\ne: {}", fieldName, object, CommonUtil.getExceptionStackTrace(e));
}
}
return null;
}
/**
* 循环向上转型, 获取当前对象以及父类所有对象的属性 Field 字段。
*
* @param objectClass
* @return
*/
public static List<Field> getDeclaredSuperFields(Class<?> objectClass) {
List<Field> declaredFieldList = new ArrayList<Field>();
Class<?> tempClass = objectClass;
try {
while(true){
if(tempClass == Object.class){
break;
}
declaredFieldList.addAll(Arrays.asList(tempClass.getDeclaredFields()));
tempClass = tempClass.getSuperclass();
}
} catch (Exception e) {
// 这里甚么都不要做!并且这里的异常必须这样写,不能抛出去。
// 如果这里的异常打印或者往外抛,则就不会执行clazz = clazz.getSuperclass(),最后就不会进入到父类中了
Logger.error("循环向上转型, 获取当前对象以及父类所有对象的属性 Field 字段异常, objectClass: {}, \n\ne: {}", objectClass, e);
}
return declaredFieldList;
}
/**
* 循环向上转型, 获取对象的 DeclaredMethod。
*
* @param object : 子类对象,也就是实现类对象;
* @param methodName : 父类中的方法名;
* @param parameterTypes : 父类中的方法参数类型;
* @return 父类中的方法对象
*/
public static Method getDeclaredMethod(Object object, String methodName, Class<?>... parameterTypes) {
Method method = null;
for (Class<?> clazz = object.getClass(); clazz != Object.class; clazz = clazz.getSuperclass()) {
try {
method = clazz.getDeclaredMethod(methodName, parameterTypes);
return method;
} catch (Exception e) {
// 这里甚么都不要做!并且这里的异常必须这样写,不能抛出去。
// 如果这里的异常打印或者往外抛,则就不会执行clazz = clazz.getSuperclass(),最后就不会进入到父类中了
// Logger.error("循环向上转型, 获取对象的 DeclaredMethod 异常, methodName: {}, object: {}, parameterTypes: {}, \n\ne: {}", methodName, object, parameterTypes, CommonUtil.getExceptionStackTrace(e));
}
}
return null;
}
/**
* 获取 Field 字段的值。
*
* @param field
* @param fieldParentObj
* @return
*/
public static Object getFieldValue(Field field, Object fieldParentObj) {
Object value = null;
try {
field.setAccessible(true);
value = field.get(fieldParentObj);
} catch (Exception e) {
Logger.error("获取 Field 字段的值异常, field: {}, fieldParentObj: {}, \n\ne: {}", field, fieldParentObj, e);
}
return value;
}
/**
* 设置 Field 字段的值。
*
* @param field
* @param fieldParentObj
* @param newValueObj
*/
public static void setFieldValue(Field field, Object fieldParentObj, Object newValueObj) {
try {
field.setAccessible(true);
field.set(fieldParentObj, newValueObj);
} catch (Exception e) {
Logger.error("设置 Field 字段的值异常, field: {}, fieldParentObj: {}, newValueObj: {}, \n\ne: {}", field,
fieldParentObj,
newValueObj, e);
}
}
/**
* 获取当前对象中子对象的属性。
*
* @param parentObj:当前对象,需要搜索查询字段所属的父类对象;
* @param searchFieldParentClass:查询字段所属字段的父类对象Class类型;
* @param searchFieldName:查询字段名称;
* @return new Object[] { searchFieldParentObject, searchField, searchFieldValue }
*/
public static Object[] getChildAttr(Object parentObj, Class<?> searchFieldParentClass, String searchFieldName) {
if (parentObj == null) {
return null;
}
Class<?> parentObjClass = parentObj.getClass();
Field foundedField = null;
Object foundedFieldValue = null;
Object[] result = null;
try {
foundedField = parentObjClass.getDeclaredField(searchFieldName);
foundedField.setAccessible(true);
foundedFieldValue = foundedField.get(parentObj);
return new Object[]{parentObj, foundedField, foundedFieldValue};
} catch (SecurityException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
// 此处异常捕获为:找不到属性名异常。
// 注意在此处我们要手工去帮它找到fi
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
SpringCloud 教程.zip (483个子文件)
index.html 430B
greeting.html 367B
index.html 286B
AnnotationReflectParser.java 23KB
BeanXml.java 19KB
GatewayZuulAttributeApplication.java 16KB
MsConsumerMovieCustomRibbonApplication.java 15KB
ReflectionUtil.java 14KB
MsGatewayZuulApplication.java 11KB
MsProviderUserMysqlMybatisMapperEhCacheApplication.java 10KB
BankDTO.java 10KB
MsConsumerMovieRibbonHystrixPropagationApplication.java 9KB
SchedulerServiceImpl.java 9KB
ISchedulerService.java 7KB
MovieRibbonHystrixPropagationController.java 7KB
MsConfigServerEncryptRsaApplication.java 7KB
MsProviderUserMysqlJdbcTransactionalApplication.java 7KB
MsConfigServerApplication.java 7KB
WebLogHeadAspect.java 6KB
WebLogFiveAspect.java 6KB
BeanReflect.java 6KB
MsConfigClientRefreshBusApplication.java 6KB
MsConfigClientApplication.java 6KB
MsConfigServerEncryptApplication.java 5KB
GeneralConsts.java 5KB
ResultDTO.java 5KB
QuartzSchedulerConfig.java 5KB
MsConsumerMovieFeignHystrixFactoryApplication.java 5KB
MsGatewayZuulFileUploadApplication.java 5KB
EurekaServerHaApplication.java 5KB
AnnotationMapping.java 5KB
MsSideCarApplication.java 5KB
MsAopWebLogApplication.java 5KB
MsGatewayZuulFilterApplication.java 4KB
MsConsumerMovieFeignCustomApplication.java 4KB
ProviderUserMysqlMybatisMapperEhCacheController.java 4KB
MsConsumerMoviePropertiesWithoutEurekaApplication.java 4KB
MsConsumerMovieFeignCustomWithoutHystrixApplication.java 4KB
MsConsumerMovieRibbonPropertiesApplication.java 4KB
MsConfigClientAuthcApplication.java 4KB
MsGatewayZuulClusterApplication.java 4KB
SimpleQuartzClusterApplication.java 4KB
Property.java 4KB
MsConsumerMovieFeignApplication.java 3KB
UserServiceImpl.java 3KB
UserMysqlJdbcTransactionalController.java 3KB
MsProviderUserApplication.java 3KB
MsConsumerMovieRibbonApplication.java 3KB
MsConfigClientRefreshApplication.java 3KB
MsGatewayZuulFallbackApplication.java 3KB
TestReflectDemo.java 3KB
MsGatewayZuulRegExpApplication.java 3KB
MsConfigServerAuthcApplication.java 3KB
UserDaoImpl.java 3KB
UserServiceImpl.java 3KB
MsConfigClientEncryptRsaApplication.java 3KB
MsConfigClientEncryptApplication.java 3KB
CustomZuulFallbackHandler.java 3KB
MovieMysqlJdbcTransactionalController.java 2KB
MsFileUploadApplication.java 2KB
MovieServiceImpl.java 2KB
MsConsumerMovieRibbonHystrixApplication.java 2KB
SimpleQuartzApplication.java 2KB
HistoryBalanceConsts.java 2KB
HystrixClientFallbackFactory.java 2KB
DetailQuartzJobBean.java 2KB
DataSourceConfig.java 2KB
ScheduleJobService.java 2KB
PreZuulFilter.java 2KB
UserDaoImpl.java 2KB
CustomFieldAnnotation.java 2KB
MsSimpleProviderUserDevtoolsApplication.java 2KB
UserFeignCustomClient.java 2KB
UserFeignCustomClient.java 2KB
MsScheduleApplication.java 2KB
MsConsumerMovieApplication.java 2KB
MsProviderUserMysqlMybatisMapperApplication.java 2KB
MsProviderUserVersionApplication.java 2KB
MovieRibbonPropertiesController.java 2KB
MsProviderUserMysqlMybatisApplication.java 2KB
AccountController.java 2KB
AccountController.java 2KB
AccountDaoImpl.java 2KB
AccountDaoImpl.java 2KB
AsyncTasks.java 2KB
CacheConfiguration.java 2KB
ProviderUserMysqlMybatisMapperController.java 2KB
ProviderUserMysqlJdbcController.java 2KB
ProviderUserMysqlMybatisController.java 2KB
UserController.java 2KB
UserController.java 2KB
MovieCustomRibbonController.java 2KB
MsProviderUserMysqlJdbcApplication.java 2KB
User.java 2KB
User.java 2KB
MovieRibbonController.java 2KB
SimpleQuartzConfigClusterApplication.java 1KB
MsProviderUserMysqlCrudRepoApplication.java 1KB
MsProviderUserMysqlApplication.java 1KB
ProviderUserMysqlController.java 1KB
共 483 条
- 1
- 2
- 3
- 4
- 5
资源评论
YOLO数据集工作室
- 粉丝: 471
- 资源: 1567
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- STC15单片机串口2使用程序例子
- 读取日志的excel生成周报 用python3开发weekplan-master.zip
- python 读取excel数据导入dbimport-data-master.zip
- K折交叉验证BP神经网络,多输入多输出BP神经网络(代码完整,数据齐全)
- B07训练原图.zip
- python-对Excel数据处理做可视化分析.zip
- 人工智能大作业-无人机图像目标检测的python源代码+文档说明.zip
- 基于GoogLeNet实现Cifar-10图像分类项目python源码(高分项目).zip
- 数据库 sql 面试题目及答案解析.docx
- 汽车常见 10 种传感器故障后的表现与解决措施.docx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功