前言
主要还是辟谣之前的网上的用法,当然也会给出最终的使用方法。这可是Kotlin,关Slf4j何事!?
辟谣内容:创建注解来解决这个问题
例如:
@Target(AnnotationTarget.CLASS)
@Retention(AnnotationRetention.RUNTIME)
annotation class Log {
companion object {
inline var <reified T> T.log: Logger
get() = LoggerFactory.getLogger(T::class.java)
set(value) {}
}
}
为什么没用
然后我看了一下StackOverflow,结果这个方法的作者说:
也有人问为什么不能这么做,作者的回答是T.log:Logger方法会在全局加载使用,注解完全是多余的!!
我试了一下,果真如此哦……
其中@KLog就是代码里的@Log,然后我把@KLog去掉
毛线啊,啥事都没发生,果然如作者所说,这个注解完全是多余的……我也是蚌埠住了,难怪作者会说不要用这个方法了。
解决方法
这可是Kotlin,有扩展方法要什么注解?为什么非要局限于注解了?我不要不就完事了。
创建一个LogExtend.kt类
加入以下代码:
package 你的package地址
import org.slf4j.Logger
import org.slf4j.LoggerFactory
fun <T : Any> T.logger(): Logger {
return LoggerFactory.getLogger(this.javaClass)
}
fun <T : Any> T.logError(e: Throwable) {
logger().error("", e)
}
fun <T : Any> T.logError(msg: String) {
logger().error(msg)
}
fun <T : Any> T.logInfo(msg:String) {
logger().info(msg)
}
fun <T : Any> T.logDebug(msg:String) {
logger().debug(msg)
}
使用方法:
直接调用logInfo即可,由于Kotlin支持字符串模板,log.info主要一个string入参的方法即可,其他方法实则都已经包括进去了。这些可太好了,连log.info的点都省去了(手动狗头)。
缺点当然也有,这就是所有的类都可以用logInfo这个方法了,但是这个问题确实也没法解决啊。
实现效果: