zoukankan      html  css  js  c++  java
  • 反射案例 -复制一个对象

    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 Student(1, "谭磊", 20);
            try {
                Student student2=(Student)ObjectCopuUtil.copyObject(student);
                System.out.println("复制成功");
               System.out.println(student2.toString());
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            
            
    
        }
    }
    
    // 创建一个拷贝对象的工具类,内部提供一个拷贝方法 接收原对象
    class ObjectCopuUtil {
        public static Object copyObject(Object object) throws Exception {
            // 3.获取Student对所对应类型的class对象(也就是Student这个类所对应的class对象)
            Class<?> class1 = object.getClass();
            // 4.通过class对象的newInstance()方法来构建一个目标对象
            Object objres = class1.newInstance();
            // 5.获取class对象的get和set方法
            for (Field fieldt : class1.getDeclaredFields()) {
                    /*//得到属性所对应的get和set方法 
                     String setMethodName="set"
                    +fieldt.getName().substring(0, 1).toUpperCase()
                     +fieldt.getName().substring(1);
                     String getMethodName="get"
                            +fieldt.getName().substring(0, 1).toUpperCase()
                             +fieldt.getName().substring(1);
                     //调用原对象的get方法获得属性值
                     Method getmethod=class1.getDeclaredMethod(getMethodName, new Class[] {});
                     Object value=getmethod.invoke(object, new Object[] {});
                     
                     //调用目标对象的set方法来给属性赋值=
                     Method setmethod=class1.getDeclaredMethod(setMethodName, new Class[] {fieldt.getType()});
                     setmethod.invoke(object, new Object[] {value});*/
                     
                //直接获取原对象属性的值
                fieldt.setAccessible(true);
                Object value=fieldt.get(object);
                fieldt.set(objres, value);
            }
    
            return objres;
    
        }
    }
    
    // 1,声明一个学生类
    class Student {
        private int id;
        private String name;
        private int age;
    
        public Student() {
            super();
        }
    
        public Student(int id, String name, int age) {
            this.id = id;
            this.name = name;
            this.age = age;
        }
    
        public int getId() {
            return id;
        }
    
        public void setId(int 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;
        }
    
        @Override
        public String toString() {
            return "Student [id=" + id + ", name=" + name + ", age=" + age + "]";
        }
    
    }
  • 相关阅读:
    mysql创建用户后无法访问数据库的问题
    mysql索引
    hadoop安装
    MySQL工作原理
    MySQL数据库优化的八种方式
    FLOAT 和 DOUBLE区别
    在C++中定义常量
    C++变量类型
    FTP主动模式、被动模式(转)
    FtpClient ReplyCode 意义及 FtpClientHelper辅助类
  • 原文地址:https://www.cnblogs.com/tanlei-sxs/p/9998774.html
Copyright © 2011-2022 走看看