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