【问题标题】:Create Java Annotation to replace a token with code创建 Java 注释以用代码替换标记
【发布时间】:2013-03-15 22:40:25
【问题描述】:

我正在做一个项目,该项目本质上是一种让用户为非常长/重复的代码创建宏的方式,这样他们就可以将这些宏放入他们的代码中,以提高可读性并鼓励可重用性。

该项目分为两个区域:一个 RCP 应用程序,用户可以在其中构建宏并将其保存到文件中,另一个是 eclipse 中的插件,用户可以在其中插入宏。

RCP 应用程序运行良好,但现在我要实现真正的一点,即我希望 java 查看一段代码并在编译时说“哦,那段代码就是这个意思”。

例如,用户可以创建一个带有标识符macro1 的宏,该标识符代表代码System.out.println("Hello World");。他们想在他们的班级foo 中使用它,看起来像:

class foo{

    //lots of java....

    macro1

    //lots more java
}

我希望用户运行他们的类,并在 Java 编译时将 macro1 替换为它的值。

我已经对此进行了一段时间的研究,并在 JavaCC 上阅读了一些内容并查看了 Ants Replace Task,但我觉得我想继续创建自定义注释以通知 Java 注释下方的此字符串应转换为/替换为位于特定文本文件中的一段 java 代码。希望以类似的方式结束:

@ExpandMacro
macro1

对我来说,这似乎是可能的,但我不知道我是不是太乐观了! :)

我的另一个担忧是它作为插件的可部署性如何?如果我创建自定义注释,我将如何使其可供用户使用?

任何建议/见解都会非常有帮助!

编辑:我还研究了Project Lombok,这看起来非常有趣。但由于 lombok 项目所需的设置量,我再次担心可部署性。

【问题讨论】:

  • 您是否希望将 java 代码(重复代码,或者您称之为宏 1)插入任意位置?或者更像是在运行函数 X 之前/之后调用此宏?因为我想知道 AspectJ 是否可以在这里提供帮助......
  • 可以在eclipse中使用代码模板吗? java-tips.org/other-api-tips/eclipse/…
  • @user1766760 是的,我希望将这些宏插入任意位置,以表示可以位于文本文件中的一些预定义代码。
  • @Rohit 代码模板很好,但我看不出它们在这种情况下如何帮助我?你能以编程方式用文件中的文本填充代码模板吗?
  • 可能是我没有清楚地理解您的用例。因此,您有一个 Java 类,它需要在编译时从另一个文件(由宏表示)加载代码。如果这是正确的,这与使用另一个 java 文件有什么不同?我想我不明白这两个步骤的过程,一个人编写代码,分配一个名称,需要自动检测并与指定名称的其他代码一起编译。

标签: java eclipse macros annotations


【解决方案1】:

执行此操作的最佳方法是注释处理器(类似于 Lombokg)。使用 JSR 269 Pluggable Annotation Processing API 配置很容易,因为带有处理器的 jar 是自动发现的。

请看:http://www.slideshare.net/PolymathicCoder/the-art-of-metaprogramming-in-java 第 34 页

【讨论】:

  • 您能否详细说明您的意思,因为我不完全理解?您的意思是我可以将注释处理器作为 jar 打包,而用户所要做的就是将其包含在类路径中?
  • 对不起,再次阅读您的问题后,我认为注释处理器不是最适合您。
  • 但是,你可以像@ExpandMacro一样创建注解,这也可以,但我认为这不是最简单的方法。
【解决方案2】:

以不同的方式看待这个问题。我认为对你来说更好的是使用动态语言(例如groovy)。您可以用 Java 编写代码并使用 Groovy 动态运行它(无需编译)——因为 Java 代码与 groovy 兼容。因此,您可以简单地将 macro1 替换为您需要的内容并运行此代码。使用 groovy 你可以

  • 编写代码比看起来像 java
  • 用真实代码替换宏
  • 无需编译即可运行代码

阅读链接: http://groovy.codehaus.org/Embedding+Groovy http://groovy.codehaus.org/Differences+from+Java

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-17
    • 1970-01-01
    • 2012-11-21
    • 2020-12-14
    • 2011-01-23
    • 2018-09-13
    • 2017-07-07
    • 2021-02-05
    相关资源
    最近更新 更多