Java注释处理器能够删除注释的代码吗?

时间:2019-08-19 15:43:20

标签: java annotations conditional-compilation

众所周知,我们可以像Lombook项目中的人一样使用自定义注释和Java注释处理器自动生成代码。但是我们可以从已编译的源中删除注释的代码吗?

我曾尝试在网络上搜索它,但只有出现的是“生成代码”主题和有关“如何使用一个批注生成服务器”的教程。 当我在寻找从prod应用程序“编译”调试消息的方法时,就想到了这一点。我可以理解,拥有调试/测试和生产代码不是一个好习惯,但是有时需要使事情保持简单。我想到了一些方案:

  1. 仅调试,在开发人员专用版本的代码中使用的延迟代码可能具有不同的重要性级别,例如:
@Debug(0) void cpuLightFunction(){}
@Debug(100) void cpuHeavyFunction(){} 

void doWork(){
   cpuLightFunction();
   cpuHeavyFunction();
}

在注释处理步骤中,我们可以使用一些选项来定义将被编译的@Debug注释的最大级别。更高级别的@Debug的任何使用都会以与@Deprecated

相同的方式产生错误或警告。
  1. 平台特定代码版本-创建仅在给定平台上运行的自定义@Platform(ANDROID) void doSomething()@Plaform(IOS) void doSomething函数以摆脱多态void doSomething(AndroidPlatform)void doSomethingAndroid()代码

  2. 具有部分条件编译的代码:

@Optional("NetworkStub")
class NetworkStub{
   // ...
}

@Optional("PaymentStub")
class PaymentStub{
   // ...
}

,并且仅使用编译器/注释处理器选项来启用/禁用部分代码,例如-Aoptional="NetworkStub",它们只会编译代码中与NetworkStub相关的代码,并删除所有与PaymentStub相关的代码。

1 个答案:

答案 0 :(得分:0)

您可以通过编写注释处理器来做到这一点,该处理器在代码生成之前在编译过程中遍历和修改程序的AST(抽象语法树)。

龙目岛计划就是这样工作的。

这个问题与How to write a Java annotation processor?几乎是重复的,但是该问题的公认答案表明这是不可能的,这实际上是错误的。