Аннотация не работает в Kotlin, неправильный init? - PullRequest
1 голос
/ 04 октября 2019

Я работаю над небольшой функцией для проекта Kotlin и пытаюсь сделать аннотацию.

Я хочу "инкапсулировать" метод внутри try catch.

Давайте скажемЯ комментирую такой метод

@LogException
fun foo(){
   //do something
}

Поэтому я хочу обработать аннотацию, чтобы позже сделать что-то вроде этого:

try{
  foo()
}catch(exception: Exception){
  // do something
  //log
}

Возможно ли это?

Я начал с учебника по Kotlin (который не должен отличаться от Java) https://medium.com/@elye.project/annotation-tutorial-for-dummies-in-kotlin-1da864acc442 Но затем я использую это

@AutoService(Processor::class) 

Чтобы зарегистрировать свой процессор, и я думаю,не инициализирует мою аннотацию.

Пока это мой код:

@Target(AnnotationTarget.FUNCTION)
@Retention(AnnotationRetention.SOURCE)
@Documented
annotation class LogException(
    val name: String,
    val statusCode: Int = 500
)

и мой процессор:

@AutoService(Processor::class)
class MyProcessor : AbstractProcessor() {

    val logger = LoggerFactory.getLogger(MyProcessor::class.java)

    override fun process(annotations: MutableSet<out TypeElement>?, roundEnv: RoundEnvironment?): Boolean {
       //do something
        logger.info("info")
        return false
    }

    override fun getSupportedAnnotationTypes(): MutableSet<String> {
        logger.info("info")
        return mutableSetOf(LogException::class.java.canonicalName)
    }

}

В данный момент я не могу видетьлюбой в моих журналах, или даже если я изменю его для исключения.

Я использую эту аннотацию в методе.

@LogException
fun foo(){
//do something
}

Есть идеи, что мне не хватает?

// делаем что-то и // регистрируем что-то, это просто пример, чтобы не вставлять весь код

1 Ответ

1 голос
/ 04 октября 2019

Невозможно изменить существующий код, используя процессоры аннотаций. Они могут создавать только новые файлы. Если вы хотите изменить существующие единицы, напишите плагин компилятора Kotlin .

Если вы хотите избавиться только от стандартных блоков захвата, используйте функцию inline, котораяоборачивает оригинальную функцию с помощью try-catch:

inline fun runLogging(code: () -> Unit) = try {
    code()
} catch (e: Exception) {
    yourLogger.log(e)
}

fun foo() = runLogging {
    throw Exception() // will be logged
}

Или вы можете сделать runLogging обобщенную функцию, которая обрабатывает только указанные исключения:

inline fun <reified E : Exception> runLogging(code: () -> Unit) = try {
    code()
} catch (e: Exception) {
    if (e is E) yourLogger.log(e)
    else throw e
}

fun foo() = runLogging<FileNotFoundException> {
    throw FileNotFoundException() // will be logged
}

fun bar() = runLogging<FileNotFoundException> {
    throw Exception() // will be rethrown
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...