• 利用java反射实现两个具有相同属性bean赋值


    
    
    
    import java.lang.reflect.Field;
    import java.lang.reflect.Method;
    
    
    
    
    public class ClassReflection {
    	
    	/**
    	 * @param class1 用于赋值的实体类 
    	 * @param class1 需要待赋值的实体类
    	 * @author ym
    	 * @CreateTime 2012-11-22下午03:23:23
    	 * 描述:反射实体类赋值
    	 */
    	public static void reflectionAttr(Object class1,Object class2) throws Exception{
    		Class clazz1 = Class.forName(class1.getClass().getName());
    		Class clazz2 = Class.forName(class2.getClass().getName());
    //		获取两个实体类的所有属性
    		Field[] fields1 = clazz1.getDeclaredFields();
    		Field[] fields2 = clazz2.getDeclaredFields();
    		ClassReflection cr = new ClassReflection();
    //		遍历class1Bean,获取逐个属性值,然后遍历class2Bean查找是否有相同的属性,如有相同则赋值
    		for (Field f1 : fields1) {
    			if(f1.getName().equals("id"))
    				continue;
    			Object value = cr.invokeGetMethod(class1 ,f1.getName(),null);
    			for (Field f2 : fields2) {
    				if(f1.getName().equals(f2.getName())){
    					Object[] obj = new Object[1];
    					obj[0] = value;
    					cr.invokeSetMethod(class2, f2.getName(), obj);
    				}
    			}
    		}
    		
    	}
    	
    	/**
         * 
         * 执行某个Field的getField方法
         * 
         * @param clazz 类
         * @param fieldName 类的属性名称
         * @param args 参数,默认为null
         * @return 
         */
        private Object invokeGetMethod(Object clazz, String fieldName, Object[] args)
        {
            String methodName = fieldName.substring(0, 1).toUpperCase()+ fieldName.substring(1);
            Method method = null;
            try 
            {
                method = Class.forName(clazz.getClass().getName()).getDeclaredMethod("get" + methodName);
                return method.invoke(clazz);
            } 
            catch (Exception e)
            {
            	e.printStackTrace();
                return "";
            }
        }
        
        /**
         * 
         * 执行某个Field的setField方法
         * 
         * @param clazz 类
         * @param fieldName 类的属性名称
         * @param args 参数,默认为null
         * @return 
         */
        private Object invokeSetMethod(Object clazz, String fieldName, Object[] args)
        {       
            String methodName = fieldName.substring(0, 1).toUpperCase()+ fieldName.substring(1);
            Method method = null;
            try 
            {
            	Class[] parameterTypes = new Class[1];
            	Class c = Class.forName(clazz.getClass().getName());
            	Field field = c.getDeclaredField(fieldName); 
            	parameterTypes[0] = field.getType();
                method = c.getDeclaredMethod("set" + methodName,parameterTypes);
                return method.invoke(clazz,args);
            } 
            catch (Exception e)
            {
            	e.printStackTrace();
                return "";
            }
        }
    
    
    }
    


  • 相关阅读:
    POJ 1325、ZOJ 1364、HDU 1150 Machine Schedule
    约数的计算
    Opencv距离变换distanceTransform应用——细化字符轮廓&&查找物体质心
    霍夫圆变换
    【奇葩笔试】—— printf() 作为函数的参数及其返回值
    【奇葩笔试】—— printf() 作为函数的参数及其返回值
    字典(dictionary)的设计
    字典(dictionary)的设计
    极值点、驻点、鞍点、拐点
    极值点、驻点、鞍点、拐点
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13317991.html
Copyright © 2020-2023  润新知