java - 如何在最终编译前使用java注解修改源代码?

标签 java annotations apt

我从 apt 工具页面上读到可以创建 AnnotationProcessors 到 generate new derived files (source files, class files, deployment descriptors, etc.) .我正在寻找这样做的例子。

我的需要是在编译时对所有带注释的字符串进行编码,以便读取类文件不允许读取静态字符串:

基本代码:

String message = (@Obfuscated "a string that should not be readable in class file");

应该改写为:

String message = new ObfuscatedString(new long[] {0x86DD4DBB5166C13DL, 0x4C79B1CDC313AE09L, 0x1A353051DAF6463BL}).toString();

基于静态ObfuscatedString.obfuscate(String) method of the TrueLicense framework ,处理器可以生成代码来替换带注释的字符串。实际上,此方法会生成字符串“new ObfuscatedString([numeric_code]).toString()”。 在运行时,ObfuscatedString 的 toString() 方法能够返回以数字代码编码的字符串。

知道如何编写 AnnotationProcessor 的 process() 方法来编辑注释代码吗?

提前致谢

最佳答案

你可以

String message = Obfuscated.decode("a string that should not be readable in class file");

它可以正常编译,但是在编译之后你有一个检查字节码的工具,例如使用 ObjectWeb 的 ASM,更改字符串文字,使其看起来像

String message = Obfuscated.decode("\u86DD\u4DBB\u5166\uC13D\u4C79\uB1CD\uC313\uAE09\u1A35\u3051\uDAF6\u463B");

为了更容易识别需要更改的字符串,您可以为它们添加一个前缀,并且您可以确保在代码被混淆后这个前缀确实出现。

String s = "Obfuscate: a string that should not be readable in class file";
// later
String message = Obfuscated.decode(s);

关于java - 如何在最终编译前使用java注解修改源代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6547753/

相关文章:

clojure - 如何在Clojure中给具体化的类添加注解?

node.js - 在 ubuntu 21.10 上的 nodejs 上安装特定版本

java - 如何从 JSESSIONID 加载 Java HttpSession?

java - 初始化抽象类的ArrayList

java - 使用 Java 到架构的映射对象作为 Freemarker 数据模型

java - 是否有等效于 Spring 的 @Value 注释的 JSR-330?

docker - 在基于 Debian 的 docker 镜像中安装 Java 运行时

ubuntu - gpg : "tag:launchpad.net:2008:redacted" not a key ID: skipping error while installing new packages using apt-get

java - Jersey 客户端的 URL 编码问题

java - 通过java小程序查询oracle数据库