关于彪哥教我学这件事情

彪哥讲讲注解和反射吧

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;
}