彪哥讲讲注解和反射吧
public static <T> T clone(Object obj,Class<T> t){
T newObj = null;
try {
//基于传递的Class对象实例化一个空对象(数据为空)
newObj = t.newInstance();
//获取Class中的所有属性
Field[] fields = t.getDeclaredFields();
for (Field f : fields) {
//获取属性名
String fname = f.getName();
//获取属性类型
Class<?> ftype = f.getType();
//获取属性对应的setter/getter方法名称
String setMethodName = "set"+fname.substring(0,1).toUpperCase()+fname.substring(1);
String getMethodName = "get"+fname.substring(0,1).toUpperCase()+fname.substring(1);
//对于布尔类型的get方法,前缀以is开头
if(Objects.equals("boolean",ftype.getName())){
getMethodName = "is"+fname.substring(0,1).toUpperCase()+fname.substring(1);
}
//根据提供的方法名称和类型获取方法对象
Method methodSet = t.getMethod(setMethodName,ftype);
Method methodGet = t.getMethod(getMethodName);
//执行参数对象的get方法取出属性值,作为目标对象的set方法参数值
Object returnVal = methodGet.invoke(obj);
methodSet.invoke(newObj,returnVal);
}
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
return newObj;
}