问题描述
我需要您的支持,感谢您对Java /注释的支持。
我要创建一个自定义批注f.e. @ModifyRegex注释变量 而我的方法是修改/替换带注释变量的部分值。
f.e.
@ModifyRegex
private String variable;
if:
variable = "AbC-ABG-kkkk-4711";
then:
variable = "ABC-4711-ABG-kkkk";
我不确定是否可能,如果可以,请给我提供一个简单的代码示例。
谢谢
解决方法
注释处理器可以创建新的源文件。他们无法更改现有的。他们也无法读取内部方法。实际上,他们无法读取任何代码,因此,您可能看到的唯一字符串文字是它的文字(heh)。 Java lang规范定义了何时将分配给字段的值视为“编译时间常数”并直接写入。如果不是,则说:
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-...";
。
那龙目岛呢?
Project Lombok完成了我刚才说的您不能做的一切:检查实际代码,并 实时修改源文件。
不幸的是,lombok是几十万行代码,其中大部分都是必须做的:没有统一的方式来做,所以这是大量的自定义代码。更重要的是,从根本上讲,它也极其复杂:IDE一直都在进行代码分析,而且如果您更改结构,这会影响从“保存时自动格式化文件”到重构脚本再到“查找来电者,等等。由于没有标准,因此必须修补编辑器才能解决。
更改字符串常量可能意味着您不需要那么多修补程序。然后它仍然非常复杂。
Lombok是开源的,如果您想调查。
NB:我是Lombok项目的核心贡献者。