【问题标题】:Implement annotation processor that allows to call method only if variable annotated with annotation (like Rust mut)实现注解处理器,仅当变量使用注解注解时才允许调用方法(如 Rust mut)
【发布时间】:2022-01-05 21:28:19
【问题描述】:

我认为最好从我想要实施的想法开始。我真的受到 Rust mut 指针的启发,因此同一类型可以同时是不可变和可变的。我在想是否有可能为 JVM 实现这样的东西。

看起来我只需要创建注释@Mutates 来注释改变当前类状态的方法和注释@Mutable 来注释局部变量、字段和参数。处理器的逻辑不是太难。对于由@Mutates 注释的方法的每次调用,我需要检查相应的变量/字段/arg 是否由@Mutable 注释。如果方法在字段上调用任何 @Mutates 方法或进行赋值(= 运算符),则该方法也必须由 @Mutates 注释。

主要问题我不知道从哪里开始,因为我没有注释处理方面的经验。根据我有限的理解,我不能使用注释处理器,因为它不应该分析方法代码......所以我似乎需要创建一些编译器插件(两个:用于 Java 和 Kotlin)。

有人可以给我一条建议吗 - 是否有可能做到这一点,这有多难(这样我就可以估计为此需要付出的努力和时间,并决定是否值得)

【问题讨论】:

  • 注释处理器不应该改变实际的类代码,而是生成新的源代码,在你的情况下,你可以做的是生成一个可能从原始类扩展的新类并覆盖方法进行所需的检查,然后将调用委托给基方法。看看immutables.github.io 可能是个好主意,因为他们使用注释处理器来做

标签: java kotlin annotation-processing


【解决方案1】:

标准注释处理接口不提供对方法体的访问。但是,其他框架可以。例如,Checker Framework 提供了一个用于注释处理的 API,该 API 下降到方法体中。在 Checker 框架上构建,您可以 create an annotation processor 在编译时强制执行您的可变性规则:如果违反规则,注释处理器将停止编译并显示 javac 错误消息。

在 Checker Framework 上构建了数十个注释处理器,并且每天在 Amazon、Facebook、Google、Uber 等公司使用。

免责声明:我是该项目的维护者之一。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多