编译时的Java代码转换

我想在源代码传递给编译器之前的编译时 转换 java源代码。 换句话说,我想创建一个能够转换的预处理器

"bla bla bla" 

进入任何其他代码,如:

 new MyClass("bla", 3) 

我的实际动机是进行字符串加密,如此处所述

有些人建议编写自定义注释处理器,但据我理解注释:

  • 它们可用于生成新的类文件,但不能在传递给编译器之前转换现有代码
  • 它们似乎在包,类或方法级别工作,但不是方法体/实现。

有些人建议使用Spoon或ObjectsWeb ASM等框架,但这些框架在现有代码库中学习和部署似乎很复杂。

我茁壮成长,为两种方法找到了一个简单的java代码预处理示例。

有没有人看到任何聪明的方法进行代码转换,而没有完全改变现有的大型代码库与多个常春藤模块? 注释似乎是最好的方法,但我不明白该怎么做。

我想你可以尝试使用Project Lombok中使用的相同技术

作者在本次采访中大致解释了这一点 :

引擎盖下发生了什么? 即,样板中的注释结果如何以字节码结尾?

Reinier :注释处理器API只允许您创建新文件,它不允许您修改其中包含注释的文件。 这是Lombok的function,因此Lombok不使用注释处理器API。

相反,Lombok仅使用注释处理器API作为将自身注入编译过程的机制。 所有注释处理器都在编译过程的早期初始化,并且当javac初始化为注释处理器时,它会修改它。 我们只改变了一件事:AST(原始源代码,解析成树forms)首先交给Lombok,在javac继续之前生成需要生成的任何东西。

和lombok如何工作?

也可以将Project Lombok扩展到您的需求

  • 使用Project Lombok进行自定义AST转换
  • Lombok项目:创建自定义转换

有人已经在python / jython中编写了一个类似C的预处理器ant插件。 你可以在这里找到它。 请注意,我从未使用它,但也许它可以成为您需求的良好起点。

谷歌代码中还有一个java-comment-preprocessor maven插件(类似样式),也可能是一个有用的起点。

祝你好运。 听起来很有趣。 当然,请记住,混淆只是让提取字符串变得更具挑战性,但仍然不是不可能的。 如果你真的想让它变得更加困难,那么你可能想看看加密你的字符串和/或使用AOP。

如果C预处理器就足够了,我只是设法让它在Windows中使用Eclipse。 它只适用于Juno。

https://stackoverflow.com/a/10497206/1137626