博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
自己通过反射写的一个属性copy类
阅读量:5260 次
发布时间:2019-06-14

本文共 3267 字,大约阅读时间需要 10 分钟。

package com.xxx.beancopier;import java.lang.annotation.Documented;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;import java.lang.reflect.Method;import java.lang.reflect.Modifier;/** * @Type BeanCopier * @Desc 属性copy类 * @author * @date 2017-01-06 * @Version V1.0 */public class BeanCopier {    private BeanCopier() {    }    public static 
DestType propertiesCopy(Object orig, DestType dest) { if (orig == null || dest == null) { throw new RuntimeException("参数不能为null"); } Method[] destMethods = dest.getClass().getMethods(); for (Method destMethod : destMethods) { if (needCopy(destMethod)) { MethodCopy methodCopy = new MethodCopy(destMethod); methodCopy.copy(orig, dest); } } return dest; } private static boolean needCopy(Method method) { PropertyCopy annotation = method.getAnnotation(PropertyCopy.class); if (annotation != null && annotation.ignore()) return false; return method.getName().startsWith("set") && method.getParameterTypes().length == 1 && Modifier.isPublic(method.getModifiers()) && !Modifier.isStatic(method.getModifiers()); } static class MethodCopy { private Method method; private String methodName; private Method getterMethod; public MethodCopy(Method destMethod) { method = destMethod; methodName = destMethod.getName(); } private void copy(Object orig, Object dest) { try { this.getterMethod = orig.getClass().getMethod("get" + methodName.substring(3)); } catch (NoSuchMethodException e) { throw new RuntimeException("对象【" + orig + "】中缺失【" + methodName.replaceFirst("set", "get") + "()】方法!"); } Object propertyValue = invokeMethod(orig, getterMethod); if (propertyValue != null) { invokeMethod(dest, method, propertyValue); } } private Object invokeMethod(Object targerObject, Method method, Object... args) { if (method == null) { throw new RuntimeException("被调用方法不能为空!"); } // 验证参数数量 Class
[] parameterTypes = method.getParameterTypes(); if (parameterTypes.length != args.length) { throw new RuntimeException("方法【" + method + "】的参数数量【" + parameterTypes.length + "】和反射调用时的参数数量【" + args.length + "】不相符,无法完成调用!"); } try { method.setAccessible(true); return method.invoke(targerObject, args); } catch (Throwable e) { throw new RuntimeException("调用对象【" + targerObject + "】的【" + method + "】方法,参数为【" + args + "】时发生异常:", e); } } }}@Retention(RetentionPolicy.RUNTIME)@Target({ ElementType.METHOD })@Documented@interface PropertyCopy { /** * 被标注方法是否被忽略拷贝 * @return */ boolean ignore() default false;}

 使用如下:

StudentDTO studentDTO1 = BeanCopier.propertiesCopy(student, new StudentDTO());

 

转载于:https://www.cnblogs.com/xlh91118/p/6277830.html

你可能感兴趣的文章
51nod1076 (边双连通)
查看>>
Item 9: Avoid Conversion Operators in Your APIs(Effective C#)
查看>>
深入浅出JavaScript(2)—ECMAScript
查看>>
STEP2——《数据分析:企业的贤内助》重点摘要笔记(六)——数据描述
查看>>
ViewPager的onPageChangeListener里面的一些方法参数:
查看>>
Jenkins关闭、重启,Jenkins服务的启动、停止方法。
查看>>
CF E2 - Array and Segments (Hard version) (线段树)
查看>>
Linux SPI总线和设备驱动架构之四:SPI数据传输的队列化
查看>>
SIGPIPE并产生一个信号处理
查看>>
CentOS
查看>>
Linux pipe函数
查看>>
java equals 小记
查看>>
爬虫-通用代码框架
查看>>
2019春 软件工程实践 助教总结
查看>>
YUV 格式的视频呈现
查看>>
现代程序设计 作业1
查看>>
在android开发中添加外挂字体
查看>>
Zerver是一个C#开发的Nginx+PHP+Mysql+memcached+redis绿色集成开发环境
查看>>
多线程实现资源共享的问题学习与总结
查看>>
java实现哈弗曼树
查看>>