如何使用 java / kotlin 中的注释处理将方法附加到现有类?

And*_*dov 8 java annotations codegen kotlin kapt

我是注释处理和代码生成的新手。我想知道如何执行这样的操作,比如将新方法附加到现有类。这是我想要做的一个例子:

假设我们有一个带有自定义注释的类,如下所示:

class SourceClass {
    @CustomAnnotation
    fun annotatedFun1(vararg argument: Any) {
        //Do something
    }

    @CustomAnnotation
    fun annotatedFun2(vararg argument: Any) {
        //Do something
    }

    fun someOtherFun() {
        //Do something
    }
}
Run Code Online (Sandbox Code Playgroud)

我想得到的结果 - 该类的扩展副本:

class ResultClass {
    fun hasFunWithName(name: String): Boolean {
        return (name in arrayOf("annotatedFun1", "annotatedFun2"))
    }

    fun callFunByName(name: String, vararg arguments: Any) {
        when (name) {
            "annotatedFun1" -> annotatedFun1(*arguments)
            "annotatedFun2" -> annotatedFun2(*arguments)
        }
    }

    fun annotatedFun1(vararg argument: Any) {
        //Do something
    }

    fun annotatedFun2(vararg argument: Any) {
        //Do something
    }

    fun someOtherFun() {
        //Do something
    }
}
Run Code Online (Sandbox Code Playgroud)

我已经找到了如何创建注释处理器。我正在寻找一种方法来保存源类中的所有现有字段、属性和方法,并向其中附加一些方法。

如果可以在不创建新类的情况下修改类 - 这将是完美的,但是在所有教程中只创建了新类,我没有找到任何将源类的所有内容复制到另一个类的示例。

请不要建议使用反射。我需要这个用于 android,所以反射不是资源成本的选择原因。我正在寻找编译时解决方案。

它是应用程序中实现的自定义脚本语言所必需的,应用于简化包装类结构。当这项工作直接在代码中完成时 - 当每个类的此类方法计数超过 20 时,这看起来很糟糕。

Ser*_*kin 4

这是我最近使用的 Java 注释处理的一个很好的例子。它是注释的实现@Immutable

查看 ByteBuddy 或 Kotlin Poet 以了解附加代码生成的工作原理。

对于 Kotlin,您可以执行几乎相同的操作,请查看本手册以了解特定于 Kotlin 的步骤。