自定义注释以修改值

custom annotations to modify values

我需要你的支持,感谢你的Java/Annotations支持..

我想创建一个自定义注释 f.e。 @ModifyRegex 注释变量 我的方法是 modify/replace 部分注释变量的值。

f.e.

@ModifyRegex
private String variable;


if:
 variable = "AbC-ABG-kkkk-4711";

then: 
 variable = "ABC-4711-ABG-kkkk";

我不确定是否可行,如果可以,请提供一个简单的代码示例..

谢谢

注释处理器可以制作新的源文件。他们不能改变现有的。他们也无法阅读内部方法。事实上,他们无法读取任何代码,因此您可能看到的唯一字符串文字是字面上的(嘿)文字。 java 语言规范定义了分配给字段的值何时被视为 'compile time constant' 并直接写入。如果不是,请说:

class Example {
    // these are all NOT constant, therefore, cannot be
    // retrieved with an annotation processor
    long x = System.currentTimeMillis();
    Pattern p = Pattern.compile("^AbC-ABG-$");
    String s = null; // null is considered non-constant, for some reason.
    String z = "HELLO!".toLowerCase();
}

但是,如果它真的很简单,例如 @Foo private String x = "Hello";,其中 x 是一个字段(而不是某处方法中的局部变量),是的,您可以看到它的实际效果。

但是您所能做的就是制作新文件。您不能更改现有文件。因此,充其量,您可以制作第二个包含 public static final String variable2 = "ABC-4711-...";.

的 class

但是龙目岛呢?

Project Lombok 做了我刚才说你不能做的一切:它检查实际代码, 修改源文件in-flight.

不幸的是,lombok 有几十万行代码,其中大部分是执行所有这些操作所必需的:没有统一的方法来执行此操作,因此它是大量自定义代码。更重要的是,它从根本上来说也是极其复杂的:IDE 一直在进行代码分析,如果你改变结构,这会对从 'auto-format my file as it is saved' 重构脚本到 'find callers' 的一切产生影响,并且这么多。因为没有标准,所以你得给编辑打个补丁才能搞定。

更改字符串常量可能意味着您不需要那么多补丁。那么还是非常复杂。

如果您想调查,Lombok 是开源的。

注意:我是 Project Lombok 的核心贡献者。