编译时的 Java 代码转换

2022-09-01 17:51:31

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

"bla bla bla" 

到任何其他代码中,例如:

new MyClass("bla", 3) 

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

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

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

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

我很乐意为这两种方法找到一个简单的java代码预处理示例。

有没有人看到任何智能的代码转换方法,而无需完全改变具有多个ivy模块的现有大型代码库?注释似乎是最好的方法,但我不明白如何做到这一点。


答案 1

我认为你可以尝试与龙目岛项目相同的技术。

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

引擎盖下发生了什么?也就是说,注释如何导致样板在字节码中结束?

Reinier:注释处理器 API 只允许您创建新文件,它不允许您修改包含注释的文件。这就是龙目岛所做的,所以龙目岛不使用注释处理器API。

相反,Lombok仅使用注释处理器API作为将自身注入编译过程的机制。所有注释处理器都在编译过程的早期进行初始化,Lombok 在将 javac 初始化为注释处理器时对其进行修改。我们只更改了一件事:AST(原始源代码,解析为树形)首先传递给龙目岛,在javac继续之前,Lombok生成需要生成的任何内容。

和 在 龙目岛如何运作?

龙目岛项目也可以根据您的需求进行扩展


答案 2

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

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

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


推荐