对象赋值转换

Posted xiangyuqi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了对象赋值转换相关的知识,希望对你有一定的参考价值。

工具类:

  


import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


public class BeanUtils {
	
	/**
	 * transBean:(对象属性转换,将A对象的属性赋值给B对象。
	 * 	前提要求:
	 * 	1:如A对象的方法:T getName() 那么B对象的方法需要对应为:setName(T t);
	 * 	2:A对象T getName()的返回值类型必须为B对象的参数类型
	 *  3:B对象只能接收一个参数
	 *  4:传入的最后一个参数没有把它忽略
	 *  逻辑:
	 *  	1:遍历A对象中所有方法
	 *  	2:遍历B对象中所有方法
	 *  	得到方法名进行判断 :
	 *  		1:将A对象的方法名getName() 改成 setName();
	 *  		2:对比B方法是否含setName()
	 *  			如果没有,此次循环结束
	 *  			如果有,继续对比返回值类型。
	 *  				1:得到A对象getName()的返回值类型
	 *  				2:得到B对象setName()的返回值类型
	 *  				3:判断类型是否一致
	 *  					如果不一致,此次循环结束 
	 *  					如果一致,将A对象的值赋给B对象
	 *  						1:执行调用getName()方法得到返回值 。
	 *  						2:执行调用setName()方法,完成赋值。
	 *  						赋值时如果有异常,需要招聘异常。
	 * @author xiangning
	 *
	 * @param bean1	带有参数的对象A
	 * @param bean2	接收参数的对象B
	 * @param ignores	忽略转换的属性。参数为字符串数组,可变参数
	 * 传入的参数可以为:
	 * 		BeanUtils.transBean(A, B , null);
	 * 		BeanUtils.transBean(A, B , "");
	 * 		BeanUtils.transBean(A, B , "age");
	 * 		BeanUtils.transBean(A, B , "age","name");
	 * 		BeanUtils.transBean(A, B , new String[0]);
	 * @throws Exception
	 */
	@Deprecated
	public static  void transBeanByMethodName(Object bean1,Object bean2,String... ignores) throws Exception {
		Method[] methods1 = bean1.getClass().getDeclaredMethods();
		Method[] methods2 = bean2.getClass().getDeclaredMethods();
		for (Method method1 : methods1) {
			String methodName1 = method1.getName();
			if(!methodName1.startsWith("get")) {
				continue;
			}
			for (Method method2 : methods2) {
				String methodName2 = method2.getName();
				boolean flag = false;
				if(!methodName2.startsWith("set")) {
					flag = true;;
				}
				String tempMethodName2 = methodName2.replace("set", "").toLowerCase();
				if(ignores != null) {
					for (int i=0 ; i < ignores.length; i++) {
						if(tempMethodName2.equals(ignores[i].toLowerCase())) {
							flag = true;
						}
					}
				}				
				if (flag) {
					continue;
				}
				if(methodName1.replaceFirst("get", "set").equals(methodName2)) {
					Type type = method1.getGenericReturnType();
					Type[] paramTypes = method2.getGenericParameterTypes();
					if (paramTypes.length > 1) {
						continue;
					}
					//System.out.println(paramTypes[0].getName());
					if(type.getTypeName().equals(paramTypes[0].getTypeName())) {
						Object obj = method1.invoke(bean1);
						method2.invoke(bean2,obj);
					}
				}
			}
		}
	}
	
	/**
	 * transBeanByAnnotation:(通过注解获对属性值进行转换)
	 * @author xiangning
	 *
	 * @param bean1	带有属性值的对象A
	 * @param bean2	接收属性值的对象B
	 * @param ignores	忽略传值的属性名,以注解@BeanTrans优先,其次是定义的属性名
	 * @throws Exception
	 */
	public static  void transBeanByAnnotation(Object bean1,Object bean2,String... ignores) throws Exception{
		  Field[] fields1 = bean1.getClass().getDeclaredFields();
		  Field[] fields2 = bean2.getClass().getDeclaredFields();
		  List<Map<Field,Object>> list1 = new ArrayList<Map<Field,Object>>();
		  for (Field field1 : fields1) {
			  Map<String,Object> fieldMap1 = BeanUtils.getFieldInfo(field1, bean1);
			  boolean flag = false;
			  if(ignores!=null) {
				  for (String string : ignores) {
						if(fieldMap1.get("name").equals(string)) {
							flag = true;
						}
					  }
			  }
			  if(flag) {
				  continue;
			  }
			  for (Field field2 : fields2) {
				  Map<String,Object> fieldMap2 = BeanUtils.getFieldInfo(field2, bean2);
				  if(fieldMap1.get("name").equals(fieldMap2.get("name"))
						  && fieldMap1.get("typeName").equals(fieldMap2.get("typeName")) ){
					  //如果属性名一样,同时数据类型一样那么就可以将A对象的值赋给B对象
					  field2.set(bean2, fieldMap1.get("obj"));
				  }
			  }
			  
		  }
	}
	
	private static Map getFieldInfo(Field field,Object bean) throws Exception {
		Map<String,Object> fieldMap = new HashMap<String,Object>();
		field.setAccessible(true);
		  String fieldName = field.getName();
		  Object value = field.get(bean);
		  String typeName = field.getGenericType().getTypeName();
		  if(field.isAnnotationPresent(BeanTrans.class)) {
			  BeanTrans annotation = field.getAnnotation(BeanTrans.class);
			  fieldName = annotation.value();
		  }
		  fieldMap.put("name", fieldName);
		  fieldMap.put("obj", value);
		  fieldMap.put("typeName", typeName);
		return fieldMap;
	}

}

 

注解:

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({ElementType.FIELD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface BeanTrans {
	public String value() default ""; 
}

  

 

以上是关于对象赋值转换的主要内容,如果未能解决你的问题,请参考以下文章

ES6解构赋值

反射给对象赋值——类型转换

web代码片段

8-2:C++继承之父类和子类对象赋值转换(公有继承)也即切片

JavaScript单行代码,也就是代码片段

对象赋值转换