利用反射将一个对象的值转存到另一对象
2017-05-23 15:03
302 查看
工作要求,要将存储在原对象中的值部分转存到另一对象,没有利用反射前的代码为:
利用反射节省了set get重复书写:
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;
}
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;
}
相关文章推荐
- 利用反射,自动将对象生成json字符串【反射应用的一个小DEMO】
- Java中的反射机制 一个利用反射进行对象拷贝的例子
- 将任意一个对象中的所有String类型 的成员变量所对应字符串中的“b”改成“a”(利用反射)
- Java中的反射机制(二) 一个利用反射进行对象拷贝的例子
- Java中的反射机制(二) 一个利用反射进行对象拷贝的例子
- 利用反射生成一个没有Nullary Constructor的类的对象
- Java中的反射机制(二) 一个利用反射进行对象拷贝的例子
- 利用反射克隆一个对象
- 一个利用反射进行对象拷贝的例子
- 利用Java的反射机制解析一个Class对象的详细内容(工具方法留用)
- 利用反射遍历一个POJO对象的各个字段名及属性。。。
- 深度复制一个对象方法。利用反射机制,不使用Serialization,也不使用ICloneable接口
- Java中的反射机制(二) 一个利用反射进行对象拷贝的例子
- 在actionform中定义一个对象,利用对象来传参数
- 自己编写的一个Json工具类,实现了反射将整个Object转换为Json对象的功能,支持Hibernate的延迟加载对象
- 利用反射动态创建对象
- 利用反射动态创建对象
- C# 利用反射动态创建对象[摘录]
- 对象的深克隆-Clone【利用反射】转:http://www.codeproject.com/csharp/cloneimpl_class.asp
- 一个利用了异步处理,事件驱动,对象序列化等技术的类Parser完整代码示例