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

标签 java kotlin annotations

我正在为 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
}

知道我缺少什么吗?

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

最佳答案

无法使用注释处理器更改现有代码。他们只能创建文件。如果您想更改现有write Kotlin compiler plugin .

如果您只想摆脱样板 catch block ,请使用 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
}

关于java - 注解在 Kotlin 中不起作用,初始化错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58239323/

相关文章:

java - 对象不是抽象的,不会覆盖抽象方法

android - Kotlin 覆盖抽象 val 行为,对象与类

android - Kotlin 注释扩展函数的接收者

java - 如何用 JSON 字符串中的实际值替换大括号?

java - 有什么办法可以避免这个 "Attribute value must be constant"错误吗?

java - 用于在 JAX-RS 服务中设置 HTTP 响应 header 的自定义注释

java - Flex AMF Remoting 请求到 Java 服务器的排队策略

java将数字值加密为字母数字值

Java 客户端/服务器 - 通过 Socket 连接发送多个字符串

android - 使用RxJava将列表插入 session 室数据库