import
java.lang.reflect.Field;
public
class
CloneUtils {
private
static
final
Class<?>[] BASE_CLASSES = {Integer.
class
,String.
class
, Double.
class
, Float.
class
,
Boolean.
class
,Character.
class
, Long.
class
, Short.
class
, Byte.
class
};
@SuppressWarnings
(
"unchecked"
)
public
static
<T> T deepClone(T t)
throws
Exception{
Class<T> clazz =(Class<T>) t.getClass();
T result = clazz.newInstance();
Field[] fields = clazz.getDeclaredFields();
for
(Field field :fields){
field.setAccessible(
true
);
if
(!isBaseClass(field.getType()))
field.set(result, deepClone(field.get(t)));
else
field.set(result, field.get(t));
}
return
result;
}
private
static
boolean
isBaseClass(Class<?> clazz) {
for
(Class<?> cc : BASE_CLASSES)
if
(cc.equals(clazz))
return
true
;
return
false
;
}
public
static
void
main(String[] args)
throws
Exception{
Person p =
new
Person(
"xiaoming"
,
"nan"
);
IDCard idCard =
new
IDCard(
11111
,
"xx市"
);
p.setIdCard(idCard);
Person pc = deepClone(p);
System.out.println(pc.getName());
}
}
class
Person{
private
String name;
private
String sex;
private
IDCard idCard;
public
IDCard getIdCard() {
return
idCard;
}
public
void
setIdCard(IDCard idCard) {
this
.idCard = idCard;
}
Person(){
}
public
String getName() {
return
name;
}
public
void
setName(String name) {
this
.name = name;
}
public
String getSex() {
return
sex;
}
public
void
setSex(String sex) {
this
.sex = sex;
}
Person(String _name,String _sex){
this
.name = _name;
this
.sex = _sex;
}
}
class
IDCard {
private
Long id;
private
String address;
public
long
getId() {
return
id;
}
public
void
setId(
long
id) {
this
.id = id;
}
public
String getAddress() {
return
address;
}
public
void
setAddress(String address) {
this
.address = address;
}
public
IDCard(){
}
public
IDCard(
long
id, String address) {
super
();
this
.id = id;
this
.address = address;
}
}