package j2se.classloader;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
/**
* <p>Project : J2SE的基础知识</p>
* <p>Tile : 利用反射 , 来实现对象的 拷贝 </p>
* <p>Description :
* 通过java的反射 , 来实现对象的 cope
* 具体是得到 Method 类的实体 , Method实体可以调用 任何 Object 对象中 getXXX 和 setXXX方法
* </p>
* <p>Date : 2013-03-23</p>
* @author
* @version 1.0
*
*/
public class TestCopyObjectByReflect {
/**
*
* @param args 类型为 : String[]
* @return void
*/
public static void main(String[] args){
User u = new User() ;
u.setId("123456") ;
u.setUserName("刘德华") ;
u.setUserAge(30) ;
User UserCopy = (User) new TestCopyObjectByReflect().copyObj(u);
System.out.println("Copy information: id = " + UserCopy.getId()
+ " , userName = " + UserCopy.getUserName()
+ " , userAge = " + UserCopy.getUserAge());
new Son() ;
}
/**
* @description 实现对象的 Copy
* @param obj 类型为 Object
* @return Object
*/
public Object copyObj(Object obj){
Object objOfCopy = null ;
try {
Class<?> clazz = obj.getClass() ;
// Object objOfCopy = clazz.newInstance() ;
objOfCopy = clazz.getConstructor(new Class[]{ }).newInstance(new Object[]{ }) ;
Field[] fs = clazz.getDeclaredFields() ;
for(Field f : fs ){
String fieldName = f.getName() ;
String firstLetter = fieldName.substring(0, 1).toUpperCase() ;
// 获得和属性对应的getXXX()方法的名字
String getMethodName = "get" + firstLetter + fieldName.substring(1);
// 获得和属性对应的setXXX()方法的名字
String setMethodName = "set" + firstLetter + fieldName.substring(1);
// 获得和属性对应的getXXX()方法 , getMethod 可以调用 任意一个实体的 getXXX() 方法
Method getMethod = clazz.getMethod(getMethodName, new Class[] {});
// 获得和属性对应的setXXX()方法 , setMethod 可以调用任意一个实体的setXXX() 方法
Method setMethod = clazz.getMethod(setMethodName, new Class[] { f.getType() });
// 调用原对象的getXXX()方法
Object value = getMethod.invoke(obj , new Object[]{}) ;
System.out.println(fieldName + ":" + value);
// 调用拷贝对象的setXXX()方法
//setMethod.invoke(objOfCopy, value) ;
setMethod.invoke(objOfCopy, new Object[]{value}) ;
}
} catch (InstantiationException 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();
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return objOfCopy ;
}
}
/**
* @description 定义一个实体 user , 用来存放用户的信息
* @author
*
*/
class User {
private String id ;
private String userName ;
private Integer userAge ;
public User(){
}
// gets and sets methods
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public Integer getUserAge() {
return userAge;
}
public void setUserAge(Integer userAge) {
this.userAge = userAge;
} ;
}
class Father {
static {
System.out.println("------------In Father static---------------------------");
}
Father() {
System.out.println("------------In Father Constraction---------------------------");
}
}
class Son extends Father{
static {
System.out.println("------------In Son static---------------------------");
}
Son() {
System.out.println("------------In Son Constraction---------------------------");
}
}
使用java 反射 copy 对象
最新推荐文章于 2024-07-12 14:26:09 发布