EchoDemo's Blogs

Java反射API(二)

1、案例介绍

Student类,有属性id,name,age,对应的get、set方法和构造方法,现产生一个Student对象。通过反射复制此Student对象。

2、案例设计

通过反射机制来获取类的属性和方法。通过反射来生成对象,并通过反射来调用其set方法来对属性进行赋值以达到复制对象的目的。最后对复制成功的对象信息进行打印。

3、方案实施

(1)创建Student类。

(2)创建一个Student对象。

(3)获取Student对象所属类型的Class对象。

(4)通过调用class.newInstance方法来构建一个目标对象。

(5)获取class对象中的get和set方法。

(6)调用源对象的get方法获取属性值。

(7)调用目标对象的set方法来设置属性值。

(8)打印目标对象的数据。

4、案例实现

package com.iotek.reflect;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import javax.activation.FileDataSource;
import org.omg.CORBA.portable.ValueBase;

public class ReflectionExampleDemo {

    public static void main(String[] args) throws InstantiationException, IllegalAccessException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException{

        Student student = new Student(1, "EchoDemo", 22);
        Student student2 = (Student) ObjectCopyUtil.copyObj(student);
        System.out.println("复制对象成功");
        System.out.println(student2.toString());
    }
}

/**
 * 这是一个拷贝对象的工具类,内部提供了一个拷贝对象的方法,接收源对象。
 * @author 紫苏半夏
 *
 */
class ObjectCopyUtil{
    public static Object copyObj(Object obj) throws InstantiationException, IllegalAccessException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException{

        //获取student对象所对应类型的Class对象(也就是Student类所对应的对象)
        Class<?> classType = obj.getClass();
        //通过class对象的newInstance方法来构建一个目标对象
        Object objCopy = classType.newInstance();
        //获取Class对象的get和set方法
        for(Field field : classType.getDeclaredFields()){
            /*//得到属性所对应的get和set方法
            String getMethodName = "get"+field.getName().substring(0,1).toUpperCase()+field.getName().substring(1);
            String setMethodName = "set"+field.getName().substring(0,1).toUpperCase()+field.getName().substring(1);
            //调用源对象的get方法获取属性值
            Method getMethod = classType.getDeclaredMethod(getMethodName, new Class[]{});
            Object value = getMethod.invoke(obj, new Object[]{});
            //调用源对象的set方法给属性赋值
            Method setMethod = classType.getDeclaredMethod(setMethodName, new Class[]{field.getType()});
            setMethod.invoke(obj, new Object[]{value});*/

            //直接获取源对象的值
            field.setAccessible(true);
            Object value = field.get(obj);
            field.set(objCopy, value);
        }

        return objCopy;
    }
}

//声明一个学生类
class Student{
    private int id;
    private String name;
    private int age;
    public Student(){

    }
    public Student(int id, String name, int age) {
        super();
        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;
    }
}
🐶 您的支持将鼓励我继续创作 🐶
-------------本文结束感谢您的阅读-------------