众所周知,我们可以像Lombook项目中的人一样使用自定义注释和Java注释处理器自动生成代码。但是我们可以从已编译的源中删除注释的代码吗?
我曾尝试在网络上搜索它,但只有出现的是“生成代码”主题和有关“如何使用一个批注生成服务器”的教程。 当我在寻找从prod应用程序“编译”调试消息的方法时,就想到了这一点。我可以理解,拥有调试/测试和生产代码不是一个好习惯,但是有时需要使事情保持简单。我想到了一些方案:
@Debug(0) void cpuLightFunction(){}
@Debug(100) void cpuHeavyFunction(){}
void doWork(){
cpuLightFunction();
cpuHeavyFunction();
}
在注释处理步骤中,我们可以使用一些选项来定义将被编译的@Debug
注释的最大级别。更高级别的@Debug
的任何使用都会以与@Deprecated
平台特定代码版本-创建仅在给定平台上运行的自定义@Platform(ANDROID) void doSomething()
和@Plaform(IOS) void doSomething
函数以摆脱多态void doSomething(AndroidPlatform)
或void doSomethingAndroid()
代码
具有部分条件编译的代码:
@Optional("NetworkStub")
class NetworkStub{
// ...
}
@Optional("PaymentStub")
class PaymentStub{
// ...
}
,并且仅使用编译器/注释处理器选项来启用/禁用部分代码,例如-Aoptional="NetworkStub"
,它们只会编译代码中与NetworkStub相关的代码,并删除所有与PaymentStub相关的代码。
答案 0 :(得分:0)
您可以通过编写注释处理器来做到这一点,该处理器在代码生成之前在编译过程中遍历和修改程序的AST(抽象语法树)。
龙目岛计划就是这样工作的。
这个问题与How to write a Java annotation processor?几乎是重复的,但是该问题的公认答案表明这是不可能的,这实际上是错误的。