用反射进行实体信息转换

79 阅读2分钟
//调用
public class Main {

   public void assetsCardSynInfo(AssetsCardItem cardItem, String messageId,  List<AssetsCardSynFail> fails){

     AssetsCard assetsCard = ReflectUtil.typeTransform(cardItem, AssetsCard.class, CertificateService.SYN_CARD_FIELD_MAP);
   }

}
/**
* ReflectUtil中的方法 用反射整合代码信息
**/
public class ReflectUtil {
/*
	 * @方法说明:类型转换
	 * @param Object object source
	 * 
	 * @param claz 需要生成实例的class target
	 * 
	 * @return 返回对应的claz的实例  
	 * 
	 * @param map 字段对应关系 key为object里面的属性名称,value为目标对象(claz)的属性名称
	 * 
	 * @版本说明:2013-10-11 pj add
	 */
	public static <T>  T typeTransform(Object object, Class<T> claz, Map<String, String> map) throws Exception{
		
		//获取到目标对象所有的属性名称和类型
		Map<String, String> fields = ReflectUtil.getFieldType(claz);
		
		// 1. 通过类加载器,根据传入的class实例化相应的对象
		Object newInstance = Class.forName(claz.getCanonicalName().toString())
				.newInstance();
		// 2. 获取到所有的keys,并且返回set类型
		Set<String> keySet = map.keySet();
		for (String key : keySet) {
			// 3. 获取到卡片的相应方法
			Method method = object.getClass().getDeclaredMethod(
					"get" + StringHelper.toUpperCaseFirstOne(key));
			// 4. 获取到sap的字段
			String sapField = map.get(key);
			
			// 判断字段类型是否存在sap的字段当中
			if (!fields.containsKey(sapField)) {
				continue;
			}
			
			// 5. 根据类型进行判断
			if (method.getReturnType().getCanonicalName().equals(
					"java.lang.String")) {
				String value = (String) method.invoke(object);
				if(StringUtils.isBlank(value))
					continue;
				//判断字符串中是否包含特殊字符,例如:< > 这些,需要替换成空
				if (value.contains("<")) {
					value = value.replaceAll("<", "");
				}
				if (value.contains(">")) {
					value = value.replaceAll(">", "");
				}

				// 6. 获取到实例的set方法
				Method method1 =null;
				
				if(fields.get(sapField).equals("java.lang.String")){
					method1=newInstance.getClass().getDeclaredMethod(
								"set" + StringHelper.toUpperCaseFirstOne(sapField), String.class);
					// 7. 通过set方法对实例赋值
					method1.invoke(newInstance, value.trim());
				}else if(fields.get(sapField).equals("java.math.BigDecimal")){
					method1 = newInstance.getClass().getDeclaredMethod(
							"set" + StringHelper.toUpperCaseFirstOne(sapField), BigDecimal.class);
					// 7. 通过set方法对实例赋值
					method1.invoke(newInstance, new BigDecimal(value));
				}else if (fields.get(sapField).equals("java.lang.Double")) {
					method1 = newInstance.getClass().getDeclaredMethod(
							"set" + StringHelper.toUpperCaseFirstOne(sapField), Double.class);
					// 7. 通过set方法对实例赋值
					method1.invoke(newInstance, new java.lang.Double(value));
				}
			}else if (method.getReturnType().getCanonicalName().equals(
					"java.lang.Double")) {
				Double value = (Double) method.invoke(object);
				if(value==null)
					continue;
				// 6. 获取到实例的set方法
				Method method1 =null;
				
				if(fields.get(sapField).equals("java.lang.String")){
					method1=newInstance.getClass().getDeclaredMethod(
								"set" + StringHelper.toUpperCaseFirstOne(sapField), String.class);
					// 7. 通过set方法对实例赋值
					method1.invoke(newInstance, String.valueOf(value).trim());
				}else if(fields.get(sapField).equals("java.math.BigDecimal")){
					method1 = newInstance.getClass().getDeclaredMethod(
							"set" + StringHelper.toUpperCaseFirstOne(sapField), BigDecimal.class);
					// 7. 通过set方法对实例赋值
					method1.invoke(newInstance, BigDecimal.valueOf(value));
				} else if (fields.get(sapField).equals("java.lang.Double")) {
					method1 = newInstance.getClass().getDeclaredMethod(
							"set" + StringHelper.toUpperCaseFirstOne(sapField), java.lang.Double.class);
					// 7. 通过set方法对实例赋值
					method1.invoke(newInstance, value);
				}
			}
		}
		return (T)newInstance;
	}
}
/*
*方法
*/
public class CertificateService{
  
    public static final Map<String, String> SYN_CARD_FIELD_MAP;
   //初始化
	static {
		Map SYN_CARD_FIELD_MAP_TMP = new HashMap<String, String>();
		SYN_CARD_FIELD_MAP_TMP.put("BUKRS","sapcompanyCode");		
		SYN_CARD_FIELD_MAP_TMP.put("ANLN1","assetsCardCode");		
		SYN_CARD_FIELD_MAP_TMP.put("ANLN2","assestSecondCode");		
		SYN_CARD_FIELD_MAP_TMP.put("ZZ_SFZG","isEstimate");			
		SYN_CARD_FIELD_MAP_TMP.put("ZZ_SWID","physicalId");			
		SYN_CARD_FIELD_MAP_TMP.put("ANLKL","sapAssetsTypeCode");	
		SYN_CARD_FIELD_MAP_TMP.put("TXT50","assetsName");			
		SYN_CARD_FIELD_MAP = Collections.unmodifiableMap(SYN_CARD_FIELD_MAP_TMP);
	 }
}