Как добавить метод к существующему классу, используя обработку аннотаций в java / kotlin? - PullRequest
0 голосов
/ 10 мая 2018

Я новичок в обработке аннотаций и генерации кода. Я хочу выяснить, как я могу выполнить такую ​​операцию, как добавление нового метода в существующий класс. Вот пример того, что я хочу сделать:

Предположим, что у нас есть класс с пользовательскими аннотациями, такими как этот:

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 на класс.

1 Ответ

0 голосов
/ 11 мая 2018

С Kotlin вы можете использовать функции расширения, и это рекомендуемый способ добавления новых функций в существующие классы, которые вы не контролируете.https://kotlinlang.org/docs/reference/extensions.html

...