利用反射将一个对象的值转存到另一对象

在工作中遇到需求,需要将一个对象的值复制到另一个对象中。原先的实现方式不包含反射,通过更新代码并引入反射技术,可以更高效地完成对象间的值转存。
摘要由CSDN通过智能技术生成

工作要求,要将存储在原对象中的值部分转存到另一对象,没有利用反射前的代码为:

public NewLCContTable replace(LCContTable mLcContTable){
		NewLCContTable newlc=new NewLCContTable();
		newlc.setAgentCode(mLcContTable.getAgentCode());
		newlc.setAgentCom(mLcContTable.getAgentCom());
		newlc.setCInValiDate(mLcContTable.getCInValiDate());
		newlc.setCInValiTime(mLcContTable.getCInValiTime());
		newlc.setContNo(mLcContTable.getContNo());
		newlc.setCValiDate(mLcContTable.getCInValiDate());
		newlc.setCValiTime(mLcContTable.getCInValiTime());
		newlc.setManageCom(mLcContTable.getManageCom());
		newlc.setPayIntv(mLcContTable.getPayIntv());
		newlc.setPayMode(mLcContTable.getPayMode());
		newlc.setPolApplyDate(mLcContTable.getPolApplyDate());
		newlc.setPrtNo(mLcContTable.getPrtNo());
		newlc.setSaleChnl(mLcContTable.getSaleChnl());
		
		
		
		return newlc;
		
	}

利用反射节省了set get重复书写:

public class Clone {
	public static void main(String[] args) {
		
		LCContSchema lcContSchema=new LCContSchema();
		lcContSchema.setPrtNo("00000");
		lcContSchema.setContNo("123456");
		LCPolSchema lcPolSchema=new LCPolSchema();
		lcPolSchema.setOperator("123");
		clone(lcContSchema, lcPolSchema);		
		System.out.println(lcPolSchema.getPrtNo());
		System.out.println(lcPolSchema.getContNo());
		System.out.println(lcPolSchema.getOperator());
		System.out.println(lcContSchema.getOperator());
		System.out.println(lcPolSchema);
	}
	public static Object clone(Object old,Object news){
		Object o1=news;
		Method [] m1=news.getClass().getMethods();
		for(Method m:m1){
			String methodname=m.getName();
			
			if(methodname.indexOf("set")!=-1){
				String name=methodname.replaceAll("set", "get");
				Method m2=null;
				try {
					m2=old.getClass().getMethod(name, null);
				} catch (SecurityException e) {					
					e.printStackTrace();
				} catch (NoSuchMethodException e) {
					continue;					
				}				
				System.out.println(m.getName());
				System.out.println("old:"+m2.getName());
				try {
					Object o2= m2.invoke(old, null);
					System.out.println(o2!=null);
					if(o2!=null){
						m.invoke(news, m2.invoke(old, null));
					}
					
				} catch (Exception e) {					
					continue;
				} 
			
			}
		}
		
		
		
		return o1;
	}
}

05-27

开了下api修改了下代码

/**
	 * 
	 * @param a  news
	 * @param b  old
	 * @return
	 */
	 public static Object transFields(Object a, Object b)
	    {
	        Class c1 = a.getClass();
	        Class c2 = b.getClass();

	        Field[] fieldsDest = c1.getDeclaredFields();
	        Field[] fieldsOrg = c2.getDeclaredFields();

	        AccessibleObject.setAccessible(fieldsDest, true); //取消访问控制检查
	        AccessibleObject.setAccessible(fieldsOrg, true);

	        for (int i = 0; i < fieldsDest.length; i++)
	        {
	            Field f = fieldsDest[i];
	            Class type = f.getType();
	            String name = f.getName();
	            String typeName = type.getName();
	            System.out.println("name:"+name);
	            System.out.println("typename:"+typeName);
	            
	            if (name.equals("FIELDNUM") || name.equals("PK") ||
	                name.equals("mErrors") || name.equals("fDate"))
	            {
	                continue;
	            }	           
	            for (int j = 0; j < fieldsOrg.length; j++)
	            {
	                //得到数据源的数据
	                Field f1 = fieldsOrg[j];
	                Class type1 = f1.getType();
	                String name1 = f1.getName();
	                String typeName1 = type.getName();
	                System.out.println("name1:"+name);
		            System.out.println("typename1:"+typeName);

	                if (name.equals("FIELDNUM") || name.equals("PK") ||
	                    name.equals("mErrors") || name.equals("fDate"))
	                {
	                    continue;
	                }
	                //赋值转换
	                if ((typeName.equals(typeName1)) && (name1.equals(name)))
	                {

	                    switch (transType(typeName))
	                    {
	                        case 3:
	                            try
	                            {
	                                f.setDouble(a, f1.getDouble(b));
	                                
	                            }
	                            catch (Exception e)
	                            {
	                                e.printStackTrace();
	                            }
	                            break
	                                    ;
	                        case 5:
	                            try
	                            {
	                                f.setInt(a, f1.getInt(b));
	                               
	                            }
	                            catch (Exception e)
	                            {
	                                e.printStackTrace();
	                            }
	                            break
	                                    ;
	                        case 93:
	                            try
	                            {
	                                f.set(a, f1.get(b));	                                
	                            }
	                            catch (Exception e)
	                            {
	                                e.printStackTrace();
	                            }
	                            break
	                                    ;
	                        default:
	                            try
	                            {
	                                f.set(a, f1.get(b));
	                                
	                            }
	                            catch (Exception e)
	                            {
	                                e.printStackTrace();
	                            }
	                            }
	                                    break;
	                    }
	                }

	            }

	            return a;
	        }
	  private static int transType(Object type)
      {
          int typecode;
          typecode = 93;
          if (type.equals("java.lang.String"))
          {
              typecode = 93;
          }
          if (type.equals("double"))
          {
              typecode = 3;
          }
          if (type.equals("int"))
          {
              typecode = 5;
          }

          return typecode;
      }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值