生成实现JSR 308"instanceof @MyAnotations"运行时检查的代码

Sai*_*ali 4 java code-generation annotations bytecode-manipulation annotation-processing

JSR 308建议向Java添加类型注释.在批准之后,程序员将能够在当前允许Java类型的任何地方添加注释.这不仅包括方法/字段/本地/参数装饰,还包括构造函数调用,类型转换以及最奇怪的实例检查.所述检查器框架使用JSR 308来实现类型限定符像@NonNull上的对象类型,或@Regex对字符串.

现在,Checkers所做的就是静态分析你的代码.那是所有编译时间检查.没关系.但我想要的是一种可以在运行时进行检查的机制.你可以声明:

@Regex String p1 = "[a-z]+";
@Regex String p1 = "[a-z)+";    // compile time error from annotation processor
Run Code Online (Sandbox Code Playgroud)

我也可以写:

if (x instanceof @Regex String) ...
Run Code Online (Sandbox Code Playgroud)

但这没有什么不同x instanceof String,没有执行运行时检查.我需要一个编译时注释处理器运行时字节码操纵器,它允许我在instanceof检查上运行任意代码并返回一个布尔值.这可能与Java有关吗?

小智 5

是的你可以.但它不是微不足道的,并且不受注释处理器可访问API的支持.可访问的注释处理器API仅限于生成新类,不允许修改现有的字节码(即使在JDK 8中).您可以在注释处理器级别转换为编译器特定的类,这样可以提供更多选项.但您必须使用编译器内部API并为每个可用的编译器(JDT和JavaC)重写它.你可以看一下Lombok项目(http://projectlombok.org/),它做了类似的事情.令人遗憾的是,Lombok尚未与JDK8s新型的anntotations兼容.