java利用反射交换两个对象中的字段相同的字段值
有时候我们的两个对象字段都是一样的,只有极少的区别,想要把一个对象字段的值,赋值给另外一个对象值
然后传给另外一个方法使用,但是这个字段太多,一个一个的复制太过繁琐。
这时候利用反射解决这个问题。
class TestObject1{ private Integer age; private String name; //特有的字段 private String weight; public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getWeight() { return weight; } public void setWeight(String weight) { this.weight = weight; } }
class TestObject2{ private Integer age; private String name; //特有的字段 private String address; public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } }
编写test测试类
public class Test { /** * origin字段向target转化 * @param origin * @param target * @return */ public static <T> T swap(Object origin,T target){ Field[] tFs = target.getClass().getDeclaredFields();//获得属性 Field[] oFs = origin.getClass().getDeclaredFields();//获得属性 for(int i=0;i<tFs.length;i++){ String tname=tFs[i].getName(); for(int j=0;j<oFs.length;j++){ if(oFs[j].getName().equals(tname)){ Object val=getValue(origin, tname); setValue(target, tname, val); } } } return target; } /** * * @param beanObj 实体类 */ private static Object getValue(Object beanObj,String name){ try { Field[] fields = beanObj.getClass().getDeclaredFields();//获得属性 Class clazz = beanObj.getClass(); for (int i = 0; i < fields.length; i++) { Field field = fields[i]; String names=field.getName(); if(!names.equals(name)){ continue; } // 此处应该判断beanObj,property不为null PropertyDescriptor pd = new PropertyDescriptor(field.getName(), clazz); Method getMethod = pd.getReadMethod(); if (getMethod != null) { //System.out.println(beanObj+"的字段是:"+field.getName()+",类型是:"+field.getType()+",取到的值是: "+getMethod.invoke(beanObj)); return getMethod.invoke(beanObj); } } } catch (Exception e) { e.printStackTrace(); } return null; } /** * * @param beanObj 实体类 * @param name 字段名 * @param value 值 */ private static void setValue(Object beanObj,String name,Object value){ try { Field[] fields = beanObj.getClass().getDeclaredFields();//获得属性 Class clazz = beanObj.getClass(); for (int i = 0; i < fields.length; i++) { Field field = fields[i]; String names=field.getName(); if(!names.equals(name)){ continue; } PropertyDescriptor pd = new PropertyDescriptor(field.getName(), beanObj.getClass()); Method setMethod = pd.getWriteMethod(); if (setMethod != null) { setMethod.invoke(beanObj, value); } } } catch (Exception e) { e.printStackTrace(); } } }
编写main方法
public static void main(String[] args) { TestObject1 test1=new TestObject1(); test1.setAge(22); test1.setName("gys"); TestObject2 test2=swap(test1,new TestObject2()); System.out.println(test2.getName()); }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
2016-02-25 angularjs的touch事件