对象赋值转换

工具类:

  


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 "";
}

  

原文地址:https://www.cnblogs.com/xiangyuqi/p/10054088.html

时间: 2024-08-30 06:43:35

对象赋值转换的相关文章

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

文章转自: http://blog.csdn.net/xiaohan2826/article/details/8536074 反射给对象赋值遇到的问题--类型转换 发布时间:2012-10-25 10:49浏览次数:225 给一个对象属性赋值可以通过PropertyInfo.SetValue()方式进行赋值,但要注意值的类型要与属性保持一致. 创建对象实例的两种方法: 1. 1 var obj = Assembly.Load("AssemblyName").CreateInstance

黑马程序员_JavaScript变量转换和Jquery对象的转换

在实际编程过程中,有很多对字符串进行判断.拆分.比较.转换类型.校验等操作,下面我会总结下JavaScript变量转换和Jquery对象的转换. 1.JavaScript 变量转换及字符串操作 1.字符串变成int类型 使用函数:parseInt(); 使用此函数,可将string类型变量转换为int类型.而且只能够对string类型变量使用.如果待转换string类型变量无发转换为int类型时,函数会返回NaN. 实例如下: var v_Num = parseInt('256ok'); //

OC对象与Core Foundation对象的转换

OC对象使用了ARC,自动释放内存,但是CF中的对象没有ARC,必须要手动进行引用计数和内存释放. 两者对象之间的互相转换有三种形式: 1.__bridge: 直接转换,部改变对象的持有状况: id obj = [NSObject new]; cfObject = (_bridge cfObject) obj; //不改变对象持有状况,cf对象不能获得obj的引用. id obc = (__bridge id)cfObject; //但obc是强引用,是被__strong修饰的,必定获得cf对象

C++ 类继承与对象赋值 情况下 成员变量的覆盖 浅析

[摘要] 类的继承以及对象的赋值会带来成员变量的相互传递.这里详细讨论了,类间继承带来的成员变量的传递采用覆盖原则,采用函数级的成员变量的取值:对象赋值带来的成员变量的传递采用,实函数采用数据类型的实函数,虚函数采用赋值源的虚函数,成员变量采用赋值源的成员变量,其实也是函数级的成员变量. [正文] 在类继承中,成员变量存在覆盖的情况,成员函数则存在隐藏和覆盖以及重载的情况.在类继承中,公有继承会导致公有成员变量的覆盖,从而使得成员函数的调用出现各种结果. [代码示例 01] #include<i

JQ——设置值、DOM对象和JQ对象的转换

1.设置值: text() :设置或返回所选元素的文本内容 html()  :设置或返回所选元素的内容(包括 HTML 标记) val() :设置或返回表单字段的值 attr() :设置或返回属性值 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>值的设置</title> <script src="https://cdn.sta

C风格字符串和C++ string 对象赋值操作的性能比较

<<C++ Primer>> 第四版 Exercise Section 4.3.1 部分Exercise 4.2.9 习题如下: 在自己本机执行如下程序,记录程序执行时间: 1 #include "stdafx.h" 2 #include <iostream> 3 #include <string> 4 #include <vector> 5 #include <ctime> 6 7 using namespace

jQuery对象与dom对象的转换

jQuery对象与dom对象的转换只有jquery对象才能使用jquery定义的方法.注意dom对象和jquery对象是有区别的,调用方法时要注意操作的是dom对象还是 jquery对象.普通的dom对象一般可以通过$()转换成jquery对象.如:$(document.getElementByIdx_x("msg"))则为jquery对象,可以使用jquery的方法.由于jquery对象本身是一个集合.所以如果jquery对象要转换为dom对象则必须取出其中的某一项,一般可通过索引取

Json对象与Json字符串的转化、JSON字符串与Java对象的转换

Json对象与Json字符串的转化.JSON字符串与Java对象的转换 一.Json对象与Json字符串的转化 1.jQuery插件支持的转换方式: $.parseJSON( jsonstr ); //jQuery.parseJSON(jsonstr),可以将json字符串转换成json对象 2.浏览器支持的转换方式(Firefox,chrome,opera,safari,ie9,ie8)等浏览器: JSON.stringify(obj)将JSON转为字符串.JSON.parse(string)

jQuery对象与dom对象的转换-$(&#39;#id)[0]

取原生态的DOM对象,因为jquery会把选择器匹配的dom对象存放在以$.fn.init为构造函数生成对象的泛型数组里. 一直以来对于通过jQuery方式获取的对象使不能直接使用JavaScript的一些方法的,开始的时候不理解,现在此案知道,原来jQuery获得的对象并不和我们平时使用getElementById获得的对象是一样的对象.所以一些新手就很迷惑,为什么${"#Element"}不能直接innerHTML,这就是原因所在,解决方式请看下文.jQuery对象与dom对象的转