在Java中将注释转换为另一种类型

时间:2018-10-09 16:38:03

标签: java

我正在使用Web库并创建一些注释-@ Get,@ Put,@ Post,@ Delete等。它们都具有相同的属性,因此可以将它们全部转换为某些“超级”注释,以使与他们的合作更加轻松?这是我的代码现在的样子:

public void createGetRoute(Get get) {
  this.path = get.path()
  this.method = "GET"
}

public void createPutRoute(Put put) {
  this.path = put.path()
  this.method = "PUT"
}

// ... And so on

我想做的是:

public void createRoute(Route route) {
  this.path = route.path()
  this.method = route.method()
}

Route是所有其他注释的“超类”。我知道我们不能扩展@interfaces,但是还有另一种方法可以使我的代码更干燥吗?

2 个答案:

答案 0 :(得分:1)

Spring框架利用了公共请求注释known as @RequestMapping,该注释接受一个方法类型和其他一些必要的参数。

在框架的较新版本中,存在方便注释,例如@GetMapping,它们应用了具有合理默认值的相同@RequestMapping注释。

最好从您能想到的最通用的路线注释开始,并且,如果您考虑考虑将它们更方便地细分为更小的方法,则 。 / p>

答案 1 :(得分:0)

因此,在研究了其他几个框架的工作方式之后,我决定采用类似的模式。我从一个普通的@Route类开始:

public @interface Route {
  String[] value() default {"/"};
  String[] pattern() default {};
  String[] consumes() default {};
  String[] produces() default {};
  HttpMethod method() default HttpMethod.GET;
  boolean blocking() default false;
  int order() default 0;
}

基本上,将其复制/粘贴到代表每种HTTP方法的类中-GET,POST,PUT等。

然后,我使用了一些反射来确定在构建路由表时应该分配给路由的HTTP方法:

RouteProperties fromAnnotation(Annotation annotation) {
    Class<? extends Annotation> type = annotation.annotationType();
    HttpMethod method;
    switch (type.getSimpleName()) {
      case "Get":
        method = GET;
        break;
      case "Post":
        method = POST;
        break;
      case "Put":
        method = PUT;
        break;
      //...
      case "Route":
        method = invoke("method", annotation, HttpMethod.class);
        break;
      default:
          method = GET;
    }
    this.method = method;

您在上方看到的invoke()方法是如何获取我感兴趣的每个属性的值。基本上看起来像这样:

private <T> T invoke(String methodName, Object instance, Class<T> returnType) {
    T result;
    try {
      result = (T) instance.getClass().getMethod(methodName).invoke(instance);
    } // Catch block
    return result;
  }

除了在多个文件中复制/粘贴Route类的所有属性外,这种方法还大大减少了我以前拥有的代码量,并且更易于维护。

谢谢大家的帮助!