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

    package com.dobn.bdgcgl.utils;  

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

    }  
时间: 2024-10-11 19:42:05

转 利用java反射实现两个具有相同属性bean赋值的相关文章

利用java反射机制 读取配置文件 实现动态类加载以及动态类型转换

作者:54dabang 在spring的学习过程之中,我们可以看出通过配置文件来动态管理bean对象的好处(松耦合 可以让零散部分组成一个整体,而这些整体并不在意之间彼此的细节,从而达到了真正的物理上的疏散耦合,而非逻辑,有了IOC之后,我们可以让SPRING充当各框架中的整合器,把技术框架进行完美的结合). Spring实现的一个重要的机制是通过反射(java.lang.reflect)读取配置文件,通过配置文件来动态生成配置文件中的类对象.Java动态加载类主要是为了不改变主程序代码,通过修

利用Java反射实现JavaBean对象相同属性复制并初始化目标对象为空的属性的BeanUtils

有时遇到将数据传输对象转换成JSON串会将属性值为空的属性去掉,利用Java反射实现JavaBean对象数据传输对象的相同属性复制并初始化数据传输对象属性为空的属性,然后转换成JSON串 package com.banksteel.util; import java.lang.reflect.Field;import java.lang.reflect.Method;import java.util.ArrayList;import java.util.Arrays;import java.ut

利用Java反射机制和泛型,全自动解析json

有啦这个简直,太爽啦, 利用Java 反射机制,利用Class 就可以得到 类的 变量  Field[] fields=cls.getDeclaredFields(); 还可以通过类中 的方法名字 去执行这个方法 m1 = cls.getDeclaredMethod(getMothodName(fields[j].getName()), String.class); m1.invoke(result,json.getString(fields[j].getName()) ); 利用泛型 去获取这

利用Java反射机制完成XML到对象的解析

对于一些小批量的数据,如果采用数据库来存取的话,未免有点大题小作,使用XML文件是个不错的方法,尤其是在一些Web应用中,经常需要缓存一部分数据,如果将这些数据形成XML文件,解析后放入一个Hashtable,那就能大大加快访问的速度. 由于工作的需要,写了一个解析工具,将XML解析成相应的对象列表.以下是源代码,希望对大家有所帮助,更希望大家帮我来改进这个工具. package com.sp.util; /* * author:hingwu * email:[email protected]

利用java反射实现tomcat运行中添加新类

个人博客地址:http://www.cnblogs.com/wdfwolf3/.转载注明出处,谢谢. Java 反射一个是可以获取程序在运行时刻的内部结构,二是在运行时刻对一个Java对象进行操作.主要用途有以下几点: 1.工厂模式:Factory类中用反射的话,添加了一个新的类之后,就不需要再修改工厂类Factory了 2.数据库JDBC中通过Class.forName(Driver)来获得数据库连接驱动 3.分析类文件:得到类中的方法等等,访问一些不能访问的变量或属性(破解别人代码). 之前

利用java 反射机制来实现一个servlet处理多种请求

如果我们想在一个servlet中处理多种请求(比如新闻的添加.删除),简单的可以在jsp提交表单的action路径中添加一个键值对,然后再servlet中接收后根据不同的值来调用不同的方法. jsp端 1 <form action="newsServlet?method=add" method="post"> 2 <input type="text" ..> 3 <input type="submit&qu

Android:利用Java反射调用@hide的API

置使用3G数据功能: 从源代码看到隐藏的API(ConnectivityManager.java): 查看文本打印? /** * Sets the persisted value for enabling/disabling Mobile data. * * @param enabled Whether the mobile data connection should be *            used or not. * @hide */ public void setMobileDa

利用java反射机制实现读取excel表格中的数据

如果直接把excel表格中的数据导入数据库,首先应该将excel中的数据读取出来. 为了实现代码重用,所以使用了Object,而最终的结果是要获取一个list如List<User>.List<Book>等,所以需要使用泛型机制去实现.下面会给出代码,可能会稍微复杂一点,但注释很清晰,希望大家耐心阅读. 在上代码之前简单说一下思路: 1.excel表格必须有表头,且表头中各列的值要与实体类的属性相同: 2.先读取表头信息,然后获取表头列数,接着确定需要使用的set方法的名称,并存到数

Java中对比两个对象中属性值[反射、注解]

在Java中通常要比较两个对象在修改前与修改后的值是否相同,一般我们采用的是反射技术获取对象的get方法[或其他的方法]获取值并做比较.如果系统将修改的属性名称也显示出来,这样就能更直观的显示类中的哪一个属性的值被修改了.然后Java中只能获取属性的名称,也就是英文标识的属性名,但是一般我们都会在属性后面添加属性的注释,但是Java不提供注释获取的方法.所以我们只能使用另外一种方式来将属性和属性注释关联起来,这就是Java中的@Annotation. public static  Map<Str