【问题标题】:Programmatically modify annotation in Java source code以编程方式修改 Java 源代码中的注解
【发布时间】:2013-01-16 03:03:46
【问题描述】:

我正在寻找一种方法来分析 Java 代码并以编程方式修改它们,

例如,代码可能是这样的:

@FindBy(id = "login")    
WebElement btnLogin;

@FindBy(xpath = "//div/a")    
List<WebElement> aNodes;

我希望检查@FindBy注解的每个字段,并将注解@FindBy更改为@Synchronized。

即:

@Synchronized
WebElement btnLogin;

@Synchronized
List<WebElement> aNodes;

与我发现的类似问题不同(他们使用 javassist 或 ASM 修改字节码),这些注释将在运行时被删除,所以我只能在源代码级别而不是在字节码级别。

到目前为止,我找到了qdox,但似乎只能分析代码而不能修改它。

我尝试自己编写正则表达式来解决它,但这似乎是一个太大的项目。

对此有什么建议吗?

【问题讨论】:

  • 如果确实如您所说,如果 cmets 或字符串中不存在 @Findby 序列,则正则表达式可以做得很好。转换真的是上下文无关的吗?
  • 也许我需要关心的唯一上下文是 @FindBy 注释必须放在 WebElement 或它们的集合之前,例如 List
  • 为什么不直接使用您选择的编辑器的搜索和替换?

标签: java static-analysis


【解决方案1】:

这个的正则表达式应该很简单

匹配任何以

开头的行
"^@FindBy"

或者,如果您担心奇怪(但有效)的语法(@FindBy(blah) protected void ..)

"^@FindBy(.*)"

也就是说,您也可以使用您最喜欢的 IDE 手动进行搜索和替换(Eclipse、IntelliJ 甚至 emacs 应该能够在所有文件中执行此操作),因为您似乎是静态执行此操作

【讨论】:

  • 谢谢,我想试试正则表达式。正则表达式可以匹配两行代码吗?我需要获取 WebElement 字段“btnLogin”的名称,以便进一步解决。我试过^[\s]*@FindBy(.*)$ 并找到第一行,但^(\s)*@FindBy(.*)$^(\s)*WebElement(.*)$ 找不到WebElement btnLogin;在第二行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-23
  • 2011-12-20
  • 2016-11-04
  • 1970-01-01
相关资源
最近更新 更多