【问题标题】:Is it possible to use Java annotations, to achieve a similar functionality as a preprocessor是否可以使用 Java 注释来实现与预处理器类似的功能
【发布时间】:2009-09-23 15:58:43
【问题描述】:

是否有可能创建一个类似预处理器的功能,该功能在 C 中可用并由 Antenna 提供。我们可以使用APT tool 来实现这个功能吗?是否有类似主题的文章或链接?

【问题讨论】:

  • -1 不清楚你想要什么。

标签: java annotations preprocessor


【解决方案1】:

注解并不是用来转换代码的工具;他们只是将元数据添加到代码中。例如,您不能将注释用于条件编译。

正如Sun's tutorial on annotations 所说:

注解提供不属于程序本身的程序的数据。它们对它们注释的代码的操作没有直接影响。

Wikipedia 说:

编译 Java 源代码时,注释可以由称为注释处理器的编译器插件处理。处理器可以生成信息性消息或创建额外的 Java 源文件或资源,然后可以对其进行编译和处理,但处理器不能修改带注释的代码本身。

因此,注释处理器插件无法为您提供 C 预处理器拥有的所有功能。

【讨论】:

    【解决方案2】:

    您可以使用注释处理框架执行编译时任务。它不如预处理器强大,因为您不能执行以下操作:

    @RunOnlyOn(OS.Mac) public void someMethod() { ... }
    

    注释处理器的一些好的用例是:

    • 从带注释的类创建映射文件,例如创建休眠映射文件;
    • 创建具有特定注释的类的索引,例如从测试类的源文件夹创建 testng xml 文件;
    • 强制执行通常不可用的编译时约束,例如having a no-arg constructor

    请注意,从 Java 6 开始不再需要 APT,因为所有正确声明的注解处理器都会参与编译。

    【讨论】:

    • 其实你可以自己做注解检查类加载器并自己实现注解;但是大多数时候不值得花时间。
    • @Esko:这听起来很有趣 :-) 你有概念验证的链接吗?
    • 呃,我想我可以制作一个(我自己还没有真正编写过 ClassLoaders),但这需要一些时间。该死的,现在你让我考虑实际去做了 :) 如果我想出有用的东西,我最终会报告回来,只是不要屏住呼吸 :)
    • 我知道这已经是 2 年多了,但只是为了继续思考 - 使用类似 Soot 的东西,您可以将注释用于条件编译,然后根据 if a 转换字节码给定的方法/类/语句具有特定的注释。您仍然需要编写 Soot 转换来进行条件编译,但是 Soot 工具包提供了很多功能来进行这种分析/转换。
    猜你喜欢
    • 2018-12-11
    • 1970-01-01
    • 1970-01-01
    • 2013-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-26
    相关资源
    最近更新 更多