反射demo(拷贝一个对象)

经过了上一次对反射的初步认知,最近又接触到了后,做了一个小demo,感觉这次带了一点理解去做的,比第一次接触反射好了许多。

上次学习的链接,有一些反射用的基础语句。https://www.cnblogs.com/deepSleeping/p/9381785.html

复制代码
package deep.blob.test;

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

import org.junit.Test;

import deep.blob.entity.Employee;

public class demo {

    @Test
    public void fun(){
        Employee emp = new Employee();
        emp.setId("1001");
        emp.setName("张三");
        emp.setGender("男");
        emp.setAge(21);
        
        cloneEmp(emp);
    }

    private Object cloneEmp(Object emp) {
        //1.获得需要克隆的类的class对象
        Class<?> clazz = emp.getClass();
        
        //2.获得所有属性
        Field[] fields = clazz.getDeclaredFields();
        
        //3.定义被克隆的对象
        Object newInstance = null;
        try {
            newInstance = clazz.newInstance();
        } catch (InstantiationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
        //4.遍历所有的属性并获得值
        for(Field field : fields){
            try {
                if (!field.getName().equals("serialVersionUID")) {
                    //设置可以访问private的属性
                    field.setAccessible(true);
                    
                    //获取克隆对象的对应属性的值并赋值给被克隆对象的对应属性名的属性
                    field.set(newInstance, field.get(emp));
                }
            } catch (IllegalArgumentException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (SecurityException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            
        }

        Method method = null;
        try {
            method = clazz.getMethod("toString");
            System.out.println(method.invoke(newInstance));
        } catch (NoSuchMethodException | SecurityException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
        return newInstance;
        
    }
}
复制代码
复制代码
 1 package deep.blob.entity;
 2 
 3 import java.io.Serializable;
 4 
 5 /**
 6  * 员工实体类
 7  * @author DeepSleeping
 8  *
 9  */
10 public class Employee implements Serializable{
11 
12     private static final long serialVersionUID = 1L;
13     
14     private String id;
15     private String name;
16     private String gender;
17     private Integer age;
18     
19     public String getId() {
20         return id;
21     }
22     public void setId(String id) {
23         this.id = id;
24     }
25     public String getName() {
26         return name;
27     }
28     public void setName(String name) {
29         this.name = name;
30     }
31     public String getGender() {
32         return gender;
33     }
34     public void setGender(String gender) {
35         this.gender = gender;
36     }
37     public Integer getAge() {
38         return age;
39     }
40     public void setAge(Integer age) {
41         this.age = age;
42     }
43     
44     @Override
45     public String toString() {
46         return this.getId() + ":" + this.getName();
47     }
48 
49 }
复制代码

 

posted @   瓶子coder  阅读(224)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示