• 【原创】解决Kotlin无法使用@Slf4j注解的问题


    前言

    主要还是辟谣之前的网上的用法,当然也会给出最终的使用方法。这可是Kotlin,关Slf4j何事!?

    辟谣内容:创建注解来解决这个问题

    例如:

    1. @Target(AnnotationTarget.CLASS)
    2. @Retention(AnnotationRetention.RUNTIME)
    3. annotation class Log {
    4. companion object {
    5. inline var <reified T> T.log: Logger
    6. get() = LoggerFactory.getLogger(T::class.java)
    7. set(value) {}
    8. }
    9. }

    为什么没用

    然后我看了一下StackOverflow,结果这个方法的作者说:

    也有人问为什么不能这么做,作者的回答是T.log:Logger方法会在全局加载使用,注解完全是多余的!!

    我试了一下,果真如此哦……

    其中@KLog就是代码里的@Log,然后我把@KLog去掉

    毛线啊,啥事都没发生,果然如作者所说,这个注解完全是多余的……我也是蚌埠住了,难怪作者会说不要用这个方法了。

    解决方法

    这可是Kotlin,有扩展方法要什么注解?为什么非要局限于注解了?我不要不就完事了。

    创建一个LogExtend.kt类

    加入以下代码:

    1. package 你的package地址
    2. import org.slf4j.Logger
    3. import org.slf4j.LoggerFactory
    4. fun T.logger(): Logger {
    5. return LoggerFactory.getLogger(this.javaClass)
    6. }
    7. fun T.logError(e: Throwable) {
    8. logger().error("", e)
    9. }
    10. fun T.logError(msg: String) {
    11. logger().error(msg)
    12. }
    13. fun T.logInfo(msg:String) {
    14. logger().info(msg)
    15. }
    16. fun T.logDebug(msg:String) {
    17. logger().debug(msg)
    18. }

    使用方法:

    直接调用logInfo即可,由于Kotlin支持字符串模板,log.info主要一个string入参的方法即可,其他方法实则都已经包括进去了。这些可太好了,连log.info的点都省去了(手动狗头)。

    缺点当然也有,这就是所有的类都可以用logInfo这个方法了,但是这个问题确实也没法解决啊。

    实现效果:

  • 相关阅读:
    刷爆力扣之构建乘积数组
    Linux进程间通信
    Go :测试switch语句(附完整源码)
    极智AI | 讲解 TensoRT Activation 算子
    【Log】为类中的所有日志打印添加前缀
    Apollo planning之PathDecider
    实战!接口优化的18种方案
    iObjects C++许可模块划分
    ES6模块
    StarRocks简介及安装
  • 原文地址:https://blog.csdn.net/DCTANT/article/details/134007369