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

标签 java kotlin annotations kapt codegen

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

假设我们有一个带有像这样的自定义注释的类:

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

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

    fun someOtherFun() {
        //Do something
    }
}

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

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
    }
}

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

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

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

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

最佳答案

这是一个good example我最近使用的 Java 注释处理。 这是an implementation @Immutable 注释。

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

对于 Kotlin,您所做的几乎相同,检查 this manual用于特定于 Kotlin 的步骤。

关于java - 如何使用 java/kotlin 中的注释处理将方法附加到现有类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50273913/

相关文章:

java - 私有(private)方法 'method' 从未使用过 Sonar 错误违规

java - 在confluence或jira中获取附件下载统计

kotlin - Kotlin停顿/崩溃编译器中的大型列表文字

android - kotlin中如何按数字排列字符串?

java - 我可以通过 freemarker 访问注释吗?

java - 如何修复具有不需要的 R 子类的项目类

java - LinkedHashMap 中的不同错误 - java8.1

安卓实时数据 : MutableData is never on active state

java - Eclipse - 导入了一个项目,Eclipse 给我错误的@override 方法注释错误

mysql - 从 Java 配置数据源(无 XML)