利用注解和反射解决代码冗余问题

在优化代码的时候发现,传参存在着高度冗余,如果后面需要改参数,很不方便。

 String pam1 = "id=" + appKey + "&sign=" + sign + "&method=" + method + "&access_token=" + token + "×tamp="
                + timestamp + "&projectCode=" + projectCode;

参考网上的方法,自己创建注解类,利用反射注入参数并实现。
利用注解和反射解决代码冗余问题_第1张图片
利用注解和反射解决代码冗余问题_第2张图片
这里解释一下注解。

  1. @Retention修饰注解,用来表示注解的生命周期
    利用注解和反射解决代码冗余问题_第3张图片
    上面三种类型生命周期:SOURCE 那怎么来选择合适的注解生命周期呢?
    首先要明确生命周期长度 SOURCE < CLASS < RUNTIME ,所以前者能作用的地方后者一定也能作用。一般如果需要在运行时去动态获取注解信息,那只能用 RUNTIME 注解;如果要 在编译时进行一些预处理操作,比如生成一些辅助代码(如 ButterKnife) ,就用 CLASS注解;如果 只是做一些检查性的操作,比如 @Override 和@SuppressWarnings,则 可选用 SOURCE 注解。
    RetentionPolicy.RUNTIME:这种类型的Annotations将被JVM保留,所以他们能在运行时被JVM或其他使用反射机制的代码所读取和使用。
  2. @Target:注解的作用目标
    @Target(ElementType.TYPE)——接口、类、枚举、注解@Target(ElementType.FIELD)——字段、枚举的常量
    @Target(ElementType.METHOD)——方法
    @Target(ElementType.PARAMETER)——方法参数
    @Target(ElementType.CONSTRUCTOR) ——构造函数
    @Target(ElementType.LOCAL_VARIABLE)——局部变量
    @Target(ElementType.ANNOTATION_TYPE)——注解
    @Target(ElementType.PACKAGE)——包
  3. @Inherited:说明子类可以继承父类中的该注解
  4. @Document 是 java 在生成文档,是否显示注解的开关

第二步是创建实体类,并导入注解,定义导出时的字段名(name)和拼接顺序(order)
利用注解和反射解决代码冗余问题_第4张图片
第三步就是写出拼接的方法

public class UrlUtil {

    public static String createURL(DeviceDTO deviceDTO){
    deviceUrl deviceUrl = deviceDTO.getClass().getAnnotation(deviceUrl.class);
    StringBuilder stringBuilder = new StringBuilder(deviceUrl.url());
    Arrays.stream(deviceDTO.getClass().getDeclaredFields())
            .filter(x -> x.isAnnotationPresent(deviceField.class))
            .sorted(Comparator.comparing(x -> x.getAnnotation(deviceField.class).order()))
            .peek(x -> x.setAccessible(true))
            .forEach(field -> {
                deviceField flightQueryField = field.getAnnotation(deviceField.class);
        Object value = "";
        try {
            value = field.get(deviceDTO);
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
        if (flightQueryField.order() == 1) {
            stringBuilder.append("?").append(flightQueryField.name() + "=" + value).append("&");
        } else {
            stringBuilder.append(flightQueryField.name() + "=" + value).append("&");
        }
    });
    return stringBuilder.toString().substring(0, stringBuilder.toString().length() - 1);
    }
}

进行测试
利用注解和反射解决代码冗余问题_第5张图片
结果
在这里插入图片描述
这里我没有加前置的url,在实体类的注解里url加上就好了

你可能感兴趣的:(java,mybatis,开发语言)