注解在Kotlin中不起作用,初始化错误?

问题描述 投票:1回答:1

[我正在为Kotlin项目开发一个小功能,正在尝试做一个注释。

我想在尝试捕获中“封装”一个方法。

可以说我注释这样的方法

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

知道我缺少什么吗?

//做某事///记录某事只是不粘贴所有代码的示例

java kotlin annotations
1个回答
1
投票

要使注释执行任何操作,应将//do something方法中的process替换为实际代码。

无法使用注释处理器更改现有代码。他们只能创建new文件。如果要更改existing个,请选择write Kotlin compiler plugin

[如果只想摆脱样板捕获块,请使用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
}
© www.soinside.com 2019 - 2024. All rights reserved.