【问题标题】:Annotation not working in Kotlin, wrong init?注释在 Kotlin 中不起作用,错误的初始化?
【发布时间】:2020-02-02 23:09:15
【问题描述】:

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

知道我缺少什么吗?

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

【问题讨论】:

    标签: java kotlin annotations


    【解决方案1】:

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

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

    【讨论】:

    • 感谢您的回复,//当然是做某事,这只是我的代码的示例。我尝试了几件事,记录器甚至抛出异常但没有成功......知道为什么吗?
    • @jpganz18 请重新阅读我的回答。我说过您不能使用注释处理器编辑现有代码。您只能检查它并创建新文件。如果你想编辑代码,write Kotlin compiler plugin。如果您只想摆脱样板文件 catch 块,请使用我的解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-19
    • 1970-01-01
    相关资源
    最近更新 更多