案例介绍:
Student类,有属性id, name, age, 还有对应的get,set方法和构造方法。
现产生一个Student对象。通过反射复制此Student对象。复制时,并不知道源对象具体的属性名称。
案例设计
- 通过反射机制来获取类的属性和方法
- 通过反射生成对象,并通过反射来调用其set方法对属性进行复制以达到复制对象的目的
- 最后对赋值成功的对象信息进行打印
方案实施
- 创建一个Student类
- 创建一个静态的Student对象
- 获取已有Student对象的Class对象
- 通过Class.newinstance方法动态构建一个副本对象
- 获取副本对象的get,set方法
- 调用源对象的get方法获取属性值
- 调用副本对象的set方法把属性值复制过来
- 打印输出
代码示例
package com.reflection;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class ObjectCopyDemo {
public static void main(String[] args) throws Exception {
//2.创建一个静态的Student对象
Student stu0=new Student("ST20161282","Henry",22);
try {
Student stu2=(Student)ObjectCopyUtil.copyObj(stu0);
System.out.println("复制对象成功");
System.out.println(stu2.toString());
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
//这是一个Copy对象的工具类,内部提供了一个Copy对象的方法,接受源对象
class ObjectCopyUtil{
public static Object copyObj(Object obj) throws Exception{
//3. 获取已有Student对象的Class对象
Class<?> classType=obj.getClass();
//4. 通过Class.newinstance方法动态构建一个副本对象
Object stu1=classType.newInstance();
//由于不知道源对象的具体属性和属性值,通过反射机制,先得到属性名称,再拼接字段得到属性对应的get,set方法
for(Field field:classType.getDeclaredFields()){
//5. 获取副本对象的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);
//6. 调用源对象的get方法获取属性值
Method getMethod=classType.getDeclaredMethod(getMethodName, new Class[]{});
Object value=getMethod.invoke(obj, new Object[]{});
//7. 调用副本对象的set方法把属性值复制过来
Method setMethod=classType.getDeclaredMethod(setMethodName, new Class[]{field.getType()});
setMethod.invoke(stu1, new Object[]{value});
}
return stu1;
}
}
//1.创建一个Student类
class Student{
private String id;
private String name;
private int age;
@Override
public String toString() {
return "Student [id=" + id + ", name=" + name + ", age=" + age + "]";
}
public Student(){
}
public Student(String id, String name, int age) {
super();
this.id = id;
this.name = name;
this.age = age;
}
public String getId() {
return id;
}
public void setId(String 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;
}
}