public class ClassUtil {
/**
* 适合两个大量相同字段类的赋值
* {@link Class#newInstance()} 该情况会返回null
* @param source 数据来源
* @param targetClass 类及构造函数为public,非抽象类,接口,数据类,原始类型等。
* @param <T>
* @return
*/
public static <T>T copy(Object source,Class<T> targetClass){
try {
T target = targetClass.newInstance();
Class sourceClass = source.getClass();
Field[] targetFields = targetClass.getDeclaredFields();
for (Field field : targetFields) {
String name = field.getName();
//设为true之后才能对private属性进行操作
field.setAccessible(true);
Field sourceField;
try {
sourceField = sourceClass.getDeclaredField(name);
sourceField.setAccessible(true);
} catch (NoSuchFieldException e) {
continue;
}
Object value = sourceField.get(source);
if (value != null){
if (field.getType().equals(sourceField.getType())){
field.set(target, value);
}else if (String.class.equals(field.getType())){
field.set(target, value.toString());
}
}
}
return target;
} catch (InstantiationException | IllegalAccessException e) {
e.printStackTrace();
}
return null;
}
}
同样,稍微改造一下,就可以给一个已有的实体增加新的值
public static void copy(Object source,Object target){
try {
Class targetClass = target.getClass();
Class sourceClass = source.getClass();
Field[] targetFields = targetClass.getDeclaredFields();
for (Field field : targetFields) {
String name = field.getName();
field.setAccessible(true);
Field sourceField;
try {
sourceField = sourceClass.getDeclaredField(name);
sourceField.setAccessible(true);
} catch (NoSuchFieldException e) {
continue;
}
Object value = sourceField.get(source);
if (value != null){
if (field.getType().equals(sourceField.getType())){
field.set(target, value);
}else if (String.class.equals(field.getType())){
field.set(target, value.toString());
}
}
}
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
这里当字段的类不同时,仅简单做了别的类到String的转换。有兴趣的可以在基础上增加别的转换,如数字之间的转换等。