【问题标题】:custom annotations to modify values自定义注释以修改值
【发布时间】:2021-01-08 11:56:12
【问题描述】:

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

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

f.e.

@ModifyRegex
private String variable;


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

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

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

谢谢

【问题讨论】:

  • 欢迎来到 SO。您似乎在这里向我们倾诉您的问题。当您首先自己取得进展并告诉我们您到目前为止所做的尝试时,事情会变得更好。

标签: java spring-boot reflection java-8 java-annotations


【解决方案1】:

注释处理器可以制作新的源文件。他们不能改变现有的。他们也无法读取内部方法。事实上,他们无法阅读任何代码,因此您可能看到的唯一字符串文字是它是否是字面意思(呵呵)文字。 Java 语言规范定义了何时将分配给字段的值视为“编译时间常数”并直接写入。如果不是,请说:

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 是开源的。

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

【讨论】:

  • 虽然我不能不同意任何一点,但我不禁想知道为什么有人会尝试做 OP 想要的事情?用注解修改实例变量——即使可能——难道不是一个危险且不可读的结构吗?
  • @Kevin 毫无疑问 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-13
相关资源
最近更新 更多