一个利用反射进行对象拷贝的例子(java反射一)

news/2024/5/19 5:44:16 标签: 反射

反射的基本方法请参考相关java书籍和api文档,如下例ReflectTester类演示了Reflection API的基本使用方法。

  ReflectTester类有一个copy(Object object)方法,这个方法能够创建一个和参数object同样类型的对象,然后把object对象中的所有属性拷贝到新建的对象中,并将它返回。

  这个例子只能复制简单的类,假定类的每个属性都有public类型的getXXX()和setXXX()方法。

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class ReflectTester
{

    // 该方法实现对Customer对象的拷贝操作
    public Object copy(Object object) throws Exception
    {
        Class<?> classType = object.getClass();


        /* 生成新的对象的讨论
        // 获得Constructor对象,此处获取第一个无参数的构造方法的
        Constructor cons = classType.getConstructor(new Class[] {});//不带参数,所以传入一个为空的数组
        // 通过构造方法来生成一个对象
        Object obj = cons.newInstance(new Object[] {});

        // 以上两行代码等价于:
        Object obj11 = classType.newInstance();  // 这行代码无法处理构造函数有参数的情况
        
        //用第二个带参数的构造方法生成对象
        Constructor cons2 = classType.getConstructor(new Class[] {String.class, int.class});
        Object obj2 = cons2.newInstance(new Object[] {"ZhangSan",20});
        
        */
        
        Object objectCopy = classType.getConstructor(new Class[]{}).newInstance(new Object[]{});
        
        //获得对象的所有成员变量
        Field[] fields = classType.getDeclaredFields();
        for(Field field : fields)
        {
            //获取成员变量的名字
            String name = field.getName();    //获取成员变量的名字,此处为id,name,age
            //System.out.println(name);

            //获取get和set方法的名字
            String firstLetter = name.substring(0,1).toUpperCase();    //将属性的首字母转换为大写            
            String getMethodName = "get" + firstLetter + name.substring(1);
            String setMethodName = "set" + firstLetter + name.substring(1);            
            //System.out.println(getMethodName + "," + setMethodName);
            
            //获取方法对象
            Method getMethod = classType.getMethod(getMethodName, new Class[]{});
            Method setMethod = classType.getMethod(setMethodName, new Class[]{field.getType()});//注意set方法需要传入参数类型
            
            //调用get方法获取旧的对象的值
            Object value = getMethod.invoke(object, new Object[]{});
            //调用set方法将这个值复制到新的对象中去
            setMethod.invoke(objectCopy, new Object[]{value});

        }

        return objectCopy;

    }

    public static void main(String[] args) throws Exception
    {
        Customer customer = new Customer("Tom",20);
        customer.setId(1L);
        ReflectTester tester = new ReflectTester();
        
        Customer customer2 = (Customer)tester.copy(customer);
        
        System.out.println(customer2.getId() + "," + customer2.getName() + "," + customer2.getAge());
        
    }
}

class Customer
{
    private long id;
    private String name;
    private int age;

    public Customer()
    {
    }

    public Customer(String name, int age)
    {
        this.name = name;
        this.age = age;
    }

    public long getId()
    {
        return id;
    }

    public void setId(long id)
    {
        this.id = id;
    }

    public String getName()
    {
        return name;
    }

    public void setName(String name)
    {
        this.name = name;
    }

    public int getAge()
    {
        return age;
    }

    public void setAge(int age)
    {
        this.age = age;
    }
}

http://www.niftyadmin.cn/n/1677793.html

相关文章

datastage7.5.1.A License 及 下载地址 Download

DataStage V 7.5.1.A 下载地址&#xff1a; http://pan.baidu.com/share/link?shareid60438&uk2030455576#dir/path%2FDataStage ------------------------------ DataStage Server License ------------------------------ Serial Number:77896 CPU Count:16 Exp…

裸奔Spring(1)

裸奔Spring(1) pom.xml <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">&…

CalendarView使用详细文档(一个很不错的日历控件)

github地址&#xff1a;https://github.com/huanghaibin-dev/CalendarView CalendarView使用详细文档 日历控件定制是移动开发平台上比较常见的而且比较难的需求&#xff0c;一般会遇到以下问题&#xff1a; 性能差&#xff0c;加载速度慢&#xff0c;原因是各种基于GridVie…

DataStage 7.5.1.A 连接 Microsoft SQL Server 的 connection string

先看图 好了&#xff0c;到这里&#xff0c;需要 【connection string】&#xff0c;是什么呢&#xff1f;在网上搜索&#xff0c;改了一下别人的&#xff0c;发现成功了&#xff01; connection string&#xff1a; ProviderSQLOLEDB.1;Persist Security InfoFalse;User IDs…

关于团队项目中对软件进行的黑盒测试的学习。

在完成一个项目的过程中&#xff0c;对项目进行测试是必不可少的。因为我的团队项目为一个聊天软件&#xff0c;目前仅限于一对一通信。在逻辑结构上较为简单&#xff0c;所以我试着先去了解了一下比较注重功能测试的黑盒测试。黑盒测试是用于测试软件功能的比较好的测试方法&a…

Android进阶系列--Design Support Library使用详解

Google在2015的IO大会上&#xff0c;给我们带来了更加详细的Material Design设计规范&#xff0c;同时&#xff0c;也给我们带来了全新的Android Design Support Library&#xff0c;在这个support库里面&#xff0c;Google给我们提供了更加规范的MD设计风格的控件。最重要的是…

Windows 下安装 DataStage V7.5.1.A (图)

【 DataStage Server 服务端安装】 License 参考&#xff1a;http://blog.csdn.net/kk185800961/article/details/8590059 【 DataStage Client 客户端安装】

[Android]Android Activity 启动模式详解

一句话区别&#xff1a;standard&#xff0c;需要即new对象&#xff0c;不管对象是否存在&#xff0c;single模式可以复用对象。运行模式与线程和 进程均没有什么关系&#xff0c;与使用场景有关系。 最近有群里的朋友问我 Activity的四种启动模式分别是什么意思&#xff1f; 当…