反射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 }

原文地址:https://www.cnblogs.com/deepSleeping/p/9799914.html

时间: 2024-10-08 06:22:03

反射demo(拷贝一个对象)的相关文章

反射和拷贝

反射 57. 什么是反射? 反射主要是指程序可以访问.检测和修改它本身状态或行为的一种能力 Java反射 在Java运行时环境中,对于任意一个类,能否知道这个类有哪些属性和方法?对于任意一个对象,能否调用它的任意一个方法 Java反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类. 在运行时构造任意一个类的对象. 在运行时判断任意一个类所具有的成员变量和方法. 在运行时调用任意一个对象的方法. 58. 什么是 java 序列化?什么情况下需要序列化? 简单说就是为了保存在内存中的各种

Java_反射demo

package com.cnit.reflect; import java.lang.reflect.Field; import java.lang.reflect.Method; public class Main { /** * @param args */ public static void main(String[] args) { try { Class<?> classObj = Class.forName("com.cnit.reflect.bean.Person&q

私有方法是封闭的?使用反射来调用一个对象的私有方法。

当我们学习C# 时接触的第一套关键字 可能就是 Private, Public, protect. Private的定义是: 用此关键字定义的方法和变量只能在对象内部使用. 但是这是绝对的么?有没有办法在调用者的空间中使用Private定义的方法或者变量呢? 让我们定义如下一个类: public class testObj {     public string PublicValue { get; set; }     private string _privateValue;       p

java 反射demo

基于类的反射 Class 对象为您提供接入类元数据的反射的所有基本hook.这类元数据包括关于类自身的信息,如包和类的父类,以及该类实施的接口.它还包括该类定义的构造函数.字段和方法的详细信息.这些最后的项目都是编程中最经常使用的项目, 因此我将在本小节的稍后部分给出一些与它们协作的实例. 对于以下三类组件中的任何一类来说 -- 构造函数.字段和方法 -- java.lang.Class 提供四种独立的反射调用,以不同的方式来获得信息.调用都遵循一种标准格式.以下是用于查找构造函数的一组反射调用

反射案例 -复制一个对象

package com.iotek.classtype; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; public class FansheDemo { public static void main(String[] args) { // 2,生成一个学生对象(被复制的那个对象,原对象) Student student = new S

反射Demo

使用反射之前的代码 public class P1 { public void eat(){ System.out.println("p1的方法"); } } public class P2 { public void sleep(){ System.out.println("p2的方法"); } } public class Reflect1 { public static void main(String[] args) throws Exception { /

简单的反射Demo

1 private void button1_Click(object sender, EventArgs e) 2 {//计时器 3 System.Diagnostics.Stopwatch watcher = new System.Diagnostics.Stopwatch(); 4 //开启计时器 5 watcher.Start(); 6 Users user = new Users(); 7 user.Name = "sa"; 8 user.Password = "1

[No000085]C#反射Demo,通过类名(String)创建类实例,通过方法名(String)调用方法

using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Text; class test { public void Method()//1 { Console.WriteLine("1:__" + "Method调用成功!"); } public void Method(string str)//2 { Cons

Java 反射 调用 demo

基础类.供demo反射练习 1 package fanshe; 2 3 public class Person { 4 public String name; 5 private String age; 6 private int p; 7 public Person() {}; 8 public Person(String name, String age) { 9 super(); 10 this.name = name; 11 this.age = age; 12 } 13 private