是否可以使注释适用于特定类型的字段?

时间:2015-06-11 06:11:39

标签: java annotations

例如,在以下注释中:

@Target(ElementType.FIELD) 
@Retention(RetentionPolicy.RUNTIME)
public @interface EndOfTheCurrentDay {
    //some staff
}
很明显,我们无法将注释应用于该类型的字段,例如Integer。但是在实现它的方式中,注释的使用可能是不安全的。除了java.util.Date之外,我怎样才能将注释应用于字段?它甚至可以吗?

3 个答案:

答案 0 :(得分:4)

不,您无法可靠地限制此操作并在编译期间生成错误 - 可以禁用注释处理器。如果您想绝对确定,则需要在处理注释时在运行时验证它:

void processAnnotations(Field f) {
    EndOfTheCurrentDay annotation = f.getAnnotation(EndOfTheCurrentDay.class);
    if(annotation == null) {
        return; // Nothing to do
    }
    if(Date.class.isAssignableFrom(f.getType())) {
        throw new Error("The @EndOfTheCurrentDay annotation may only be applied to fields of type Date");
    }
    // Do something with the field
}

答案 1 :(得分:2)

是的,如果您在错误类型的字段上编写注释,则可能导致编译器发出错误消息。

您不能通过标准的@Target元注释来完成此操作。相反,您需要编写注释处理器。注释处理器将检查源代码中每次出现的注释@EndOfTheCurrentDay,如果将@EndOfTheCurrentDay应用于非Date,它会发出错误(就像任何其他编译器错误一样)类型。这是一个简短的,简单的注释处理器。

运行注释处理器时只会收到编译时警告,但是可以在项目的构建文件中将-processor ...命令行参数添加到javac。

答案 2 :(得分:0)

编写注释处理器:

saveScoreOnDb: function () {
  var self = this;

  return new Promise(function (resolve, reject) {
    if (!self.scoreUpdated && (self.score > self.game.global.currentUser.high_score)) {
      // do this just once
      self.scoreUpdated = true;

      // save current score on Db
      var xhttp = new XMLHttpRequest();
      xhttp.open("PUT", "https://myproject.herokuapp.com/api/users/" + self.game.global.currentUser.id, true);
      xhttp.setRequestHeader("Content-Type", "application/json;charset=UTF-8");
      var input = JSON.stringify({
        'high_score': self.score
      });

      xhttp.onload = function () {
        if (xhttp.readyState == XMLHttpRequest.DONE && xhttp.status == 200) {
          console.log('resolved the savetoDB thingy');
          resolve(xhttp.response);
        }
      };
      xhttp.onerror = function () {
        reject(xhttp.statusText);
      };

      xhttp.send(input);
    } else {
      resolve(self.getRankingFromDb());
    }
  });
}

并在META-INF / services / javax.annotation.processing.Processor中注册