为了账号安全,请及时绑定邮箱和手机立即绑定

自动生成替换方法

自动生成替换方法

幕布斯6054654 2023-04-26 17:17:08
在为我正在制作的应用程序创建语言文件时,我遇到了很多样板代码。我目前有一个包含所有语言字符串的类,然后我使用反射将这些字符串写入文件。我经常遇到的是我的字符串中有某些我想替换的占位符,例如我可能有这样的字符串:public static String USER_INFO = "Username: %name% money: %balance%";我想要实现的是生成一些基于注释的方法,例如我可以使用 lombok 生成 getters/setters 和其他方法。基于上面的字符串,我会有一个名为Arguments(正确地应该命名为 Replacers 或更有意义的东西)的注释,如下所示:@Retention(RetentionPolicy.SOURCE)@Target(ElementType.FIELD)public @interface Arguments {  String[] value();}我想做的是添加这样的注释:@Arguments(        value = {"%balance%", "%name%"})public static String USER_INFO = "Username: %name% - money: %balance%";并获取以下自动生成的替换方法:public static String USER_INFONameReplacement(String name) {    return USER_INFO.replace("%name%", name);}public static String USER_INFOAllReplacement(String name, String balance) {    return USER_INFO.replace("%name%", name).replace("%balance%", balance);}public static String USER_INFOBalanceReplacement(String balance) {    return USER_INFO.replace("%balance%", balance);}但我似乎无法让它注册?所以我的第一个问题是,如果我想实现这个目标,AbstractProcessor 是可行的方法吗?如果不是那怎么办?如果是,那为什么不注册?我正在使用 IntelliJ 并进入设置 -> 构建 -> 编译器并将注释处理器更改为启用并将处理器路径设置为我的 SuggestProcessor
查看完整描述

2 回答

?
POPMUISE

TA贡献1765条经验 获得超5个赞

Java Annotation Processing (APT) 插件旨在基于其他类生成代码。这些类最终位于生成的源文件夹中,该文件夹随后也会被编译。这些 APT 插件是从类路径/构建工具配置中发现的,并且也由 IntelliJ 编译器运行。请记住:APT 用于生成源代码,根本不是用于替换现有类。Lombok 仍然能够这样做的唯一原因是因为他们非常深入地侵入了编译器,并且通过这种方式能够在编译下操作类的 AST。

由于这种方法在未来的 Java 版本中存在很大争议并且容易出错,因此任何人都极不可能尝试构建基于 APT 的类替换框架或能够做到这一点的 Lombok 扩展(我们不是这是因为 Lombok 是唯一可以被视为此类 APT 使用的“框架”的工具,而 Lombok 本身根本不是以可扩展的方式构建的)。

总之:APT 可能是可行的方法,但您的处理器必须创建一个新类,而不是尝试修改现有类。

我不确定为什么您当前的注释处理器没有与您的编译器正确关联。如果您使用的是 Maven,则可以尝试在本地为您的处理器安装工件,并将其作为编译依赖项添加到您的其他项目中。

在 Java 中没有修改编译类的真正方法,所以如果你真的必须在同一个类中使用该方法,那么不幸的是,这意味着它无法完成。


查看完整回答
反对 回复 2023-04-26
?
小唯快跑啊

TA贡献1863条经验 获得超2个赞

您可以像 Lombok 一样修改抽象语法树 (AST),而不是实际创建文件并写入文件。不建议这样做,不同的编译器以不同的方式实现 AST,但您可以从 github ( https://github.com/rzwitserloot/lombok )扩展 Lombok 源代码,并在需要时制作注释处理程序。但是,它有点难,因此请确保您确实需要它。


抱歉,我没有正确阅读您的问题。要注册它,您需要在使用注释和注释处理器的项目中创建一个 META-INF\services 目录。在该目录中,制作一个名为“javax.annotation.processing.Processor”的 txt 文件,其中包含处理器的名称,例如 mypackage.SuggestProcessor。如果您决定使用 java 9,您还可以在 module-info 文件中声明处理器。处理器的模块必须包含“provides javax.annotation.processing.Processor with something.SuggestProcessor”,使用注释的模块必须包含“uses javax.annotation.processing.Processor”。这就是 javac 注册注释处理器的方式。


查看完整回答
反对 回复 2023-04-26
  • 2 回答
  • 0 关注
  • 73 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信