zoukankan      html  css  js  c++  java
  • 利用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 "";
            }
        }
    
    
    }
    


  • 相关阅读:
    【jQuery】用jQuery给文本框添加只读属性【readOnly】
    解决embed标签显示在div上层【转藏】
    width:100% 和 max-width:100%; 有区别吗【转藏】
    一位资深程序员的独白
    jQuery 取值、赋值的基本方法【转藏】
    js判断手机端操作系统(Andorid/IOS)
    PhpStrom 和 wamp 配置 xdebug
    php 中 ?? 和 empty 的 区别
    phpSpreadSheet 中 使用的 一些坑
    html td 限制 高度 和 宽度
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13317991.html
Copyright © 2011-2022 走看看