67,513
社区成员
发帖
与我相关
我的任务
分享
import java.lang.reflect.Field;
public class ObjectCopy {
public static void main(String[] args) throws Exception {
A baseObject = new A(new B(new C("bString1", "bString2"), 1, 2), new C(
"cString1", "cString2"));
A copyObject = (A) copyObject(baseObject, "java.lang.Integer",
"java.lang.String");
System.out.println(baseObject);
System.out.println(copyObject);
}
/**
* COPY对象(毛病还是很多的。。)
*
* @author Lv9
* @since 2010.03.09
* @param Object baseObject 将要被COPY的对象
* @param String[] noCopyClassNames 对象内不必深COPY的属性声明(如java.lang.Integer)
*/
public static Object copyObject(Object baseObject,
String... noCopyClassNames) throws Exception {
Object copyObject = baseObject.getClass().newInstance();
Field[] fields = baseObject.getClass().getDeclaredFields();
for (Field field : fields) {
field.setAccessible(true);
if (checkClassType(field.getType().getName(), noCopyClassNames)) {
field.set(copyObject, field.get(baseObject));
} else {
field.set(copyObject, copyObject(field.get(baseObject),
noCopyClassNames));
}
}
return copyObject;
}
public static boolean checkClassType(String className,
String[] noCopyClassNames) {
for (String noCopyClassName : noCopyClassNames) {
if (className.equals(noCopyClassName)) {
return true;
}
}
return false;
}
}
class A {
private B b;
private C c;
public A() {
}
public A(B b, C c) {
this.b = b;
this.c = c;
}
public B getB() {
return b;
}
public void setB(B b) {
this.b = b;
}
public C getC() {
return c;
}
public void setC(C c) {
this.c = c;
}
@Override
public String toString() {
return "[A: b = " + b + ",c = " + c + ",hashCode = " + hashCode() + "]";
}
}
class B {
private C c;
private Integer int1;
private Integer int2;
public B() {
}
public B(C c, Integer int1, Integer int2) {
this.c = c;
this.int1 = int1;
this.int2 = int2;
}
public C getC() {
return c;
}
public void setC(C c) {
this.c = c;
}
public Integer getInt1() {
return int1;
}
public void setInt1(Integer int1) {
this.int1 = int1;
}
public Integer getInt2() {
return int2;
}
public void setInt2(Integer int2) {
this.int2 = int2;
}
@Override
public String toString() {
return "[B: int1 = " + int1 + ",int2 = " + int2 + ",c = " + c
+ ",hashCode = " + hashCode() + "]";
}
}
class C {
private String string1;
private String string2;
public C() {
}
public C(String string1, String string2) {
this.string1 = string1;
this.string2 = string2;
}
public String getString1() {
return string1;
}
public void setString1(String string1) {
this.string1 = string1;
}
public String getString2() {
return string2;
}
public void setString2(String string2) {
this.string2 = string2;
}
@Override
public String toString() {
return "[C: string1 = " + string1 + ",string2 = " + string2
+ ",hashCode = " + hashCode() + "]";
}
}