开发小分享

1.两个几乎相同的实体,只是有部分字段不同,此时需要从一个实体拷贝相同的数据到另一个实体,调用set方法去执行。
如果实体的成员变量很多 二三十个,那我们的代码就写二三十行。代码就会显得十分臃肿。

解决办法:
1. 使用反射的机制可以减少代码但是性能很差不推荐。
2. 使用BeanUtils.copyPropertie 或者 PropertyUtils.copyProperties 拷贝属性 ,性能也很不好
3. 使用 BeanCopier copier = BeanCopier.create(Bean1.class, Bean2.class, false); 定义后 再使用copier.copy(bean1, bean2, null);
性能几乎和写二三十个set的代码一样


2. Eclipse自动生成toString()方法,方便调试,


3. 自动生成对象属性值,用于单元测试。是否有在测试用例中定义一个对象然后赋值,如果这个对象的属性很多我们会见到如下代码:

      Org infoOrg = new Org();
      infoOrg.setOpCode("51");
      infoOrg.setZoneCode("755AA");
      infoOrg.setWaybillNo("002101012527");
      infoOrg.setBarScanTm(new Date("2014/3/25 8:20:00"));
      infoOrg.setOpAttachInfo("550103612904");
      infoOrg.setBarOprCode("264845");
      infoOrg.setCourierCode("136026");
      infoOrg.setPhoneZone("010AA");
      infoOrg.setPhone("85202056");
      infoOrg.setSubbillPieceQty(1);
      infoOrg.setWeightQty(38.20);
      infoOrg.setOtherInfo("T801");
    infoOrg.setDestZoneCode("766A");
 
代码中大量的调用set方法,部分属性不会影响测试用例但是又要有值,有什么方法可以在定义一个对象之后直接初始化呢?
下面这个类可以基本解决此烦恼
public class CreateObjectUtil {

public static void reflect(Object bean) {

try {
Field[] fields = bean.getClass().getDeclaredFields();

Method[] methods = bean.getClass().getMethods();

Set<String> methodNameSet = new HashSet<String>();

for (Method method : methods) {
methodNameSet.add(method.getName());
}

for (Field field : fields) {
String fieldName = field.getName();// 取出字段名称

String setMethodName = "set" + fieldName.substring(0, 1).toUpperCase()
+ fieldName.substring(1);
if (!methodNameSet.contains(setMethodName)) {
continue;
}

System.out.println(setMethodName);
Method method = bean.getClass().getDeclaredMethod(setMethodName);

if (field.getType().toString().equals("int")) {
method.invoke(bean, new Object[] { Integer.parseInt("20") });
} else {
method.invoke(bean, new Object[] { "ABC" });
}
System.out.println(bean);
}

} catch (Exception e) {
e.printStackTrace();
}
}

public static void fillingParam(Object obj) {

Field[] fields = obj.getClass().getDeclaredFields();// 根据Class对象获得属性
try { // 私有的也可以获得
for (Field f : fields) {
String proName = f.getName(); // 获取属性名称
Method[] methods = obj.getClass().getDeclaredMethods();
for (Method m : methods) {
String mName = m.getName().toLowerCase(); // 获取小写的方法的名称
if (mName.equals("set" + proName.toLowerCase())) { // 如果方法名称和属性的名称
if (f.getType().getName().contains("String")) { // f.getType().getName()

if (mName.contains("date")) {
m.invoke(obj, "20140401");
} else {
m.invoke(obj, proName);
}
} else if (f.getType().getName().contains("Date")) {
m.invoke(obj, new Date());
} else if (f.getType().getName().contains("Integer")) {
m.invoke(obj, 1);
} else if (f.getType().getName().contains("Set")) {
m.invoke(obj, new HashSet());
} else if (f.getType().getName().contains("List")) {
m.invoke(obj, new ArrayList());
} else if (f.getType().getName().contains("Map")) {
m.invoke(obj, new HashMap());
}
}
}
}
} catch (Exception e) {
e.printStackTrace();
}

}

public static void main(String[] args) {

ConveyanceShowEntity conveyanceShowEntity = new ConveyanceShowEntity();
ConveyanceEntity conveyanceEntity = new ConveyanceEntity();
TransportBatch transportBatch = new TransportBatch();
fillingParam(conveyanceShowEntity);
fillingParam(conveyanceEntity);
fillingParam(transportBatch);
EntityCopier.conveyanceShowcopier.copy(conveyanceEntity, conveyanceShowEntity, null);

}
}

猜你喜欢

转载自lionzm.iteye.com/blog/2044076