From de4b50944e5a708ad3228d7d912679471e33b266 Mon Sep 17 00:00:00 2001 From: fankesyooni Date: Sat, 23 Sep 2023 22:48:35 +0800 Subject: [PATCH] refactor: merge LoggerFactory to YukiLog --- .../finder/base/ClassBaseFinder.kt | 7 +- .../finder/base/MemberBaseFinder.kt | 7 +- .../finder/classes/DexClassFinder.kt | 8 +- .../finder/members/ConstructorFinder.kt | 4 +- .../finder/members/FieldFinder.kt | 4 +- .../finder/members/MethodFinder.kt | 4 +- .../finder/tools/ReflectionTool.kt | 12 +- .../yukireflection/log/LoggerFactory.kt | 67 ---------- .../yukireflection/utils/debug/YukiLog.kt | 117 ++++++++++++++++++ 9 files changed, 139 insertions(+), 91 deletions(-) delete mode 100644 yukireflection-core/src/main/java/com/highcapable/yukireflection/log/LoggerFactory.kt create mode 100644 yukireflection-core/src/main/java/com/highcapable/yukireflection/utils/debug/YukiLog.kt diff --git a/yukireflection-core/src/main/java/com/highcapable/yukireflection/finder/base/ClassBaseFinder.kt b/yukireflection-core/src/main/java/com/highcapable/yukireflection/finder/base/ClassBaseFinder.kt index d509f08..28d7abf 100644 --- a/yukireflection-core/src/main/java/com/highcapable/yukireflection/finder/base/ClassBaseFinder.kt +++ b/yukireflection-core/src/main/java/com/highcapable/yukireflection/finder/base/ClassBaseFinder.kt @@ -30,8 +30,7 @@ package com.highcapable.yukireflection.finder.base import com.highcapable.yukireflection.YukiReflection import com.highcapable.yukireflection.annotation.YukiPrivateApi -import com.highcapable.yukireflection.log.yLoggerE -import com.highcapable.yukireflection.log.yLoggerI +import com.highcapable.yukireflection.utils.debug.YukiLog /** * 这是 [Class] 查找类功能的基本类实现 @@ -64,7 +63,7 @@ abstract class ClassBaseFinder internal constructor(internal open val loaderSet: * @param msg 调试日志内容 */ internal fun onDebuggingMsg(msg: String) { - if (YukiReflection.Configs.isDebug) yLoggerI(msg) + if (YukiReflection.Configs.isDebug) YukiLog.debug(msg) } /** @@ -75,7 +74,7 @@ abstract class ClassBaseFinder internal constructor(internal open val loaderSet: if (isShutErrorPrinting) return /** 判断是否为 [LOADERSET_IS_NULL] */ if (throwable?.message == LOADERSET_IS_NULL) return - yLoggerE(msg = "NoClassDefFound happend in [$loaderSet]", e = throwable) + YukiLog.error(msg = "NoClassDefFound happend in [$loaderSet]", e = throwable) } @YukiPrivateApi diff --git a/yukireflection-core/src/main/java/com/highcapable/yukireflection/finder/base/MemberBaseFinder.kt b/yukireflection-core/src/main/java/com/highcapable/yukireflection/finder/base/MemberBaseFinder.kt index 333b723..0abb7ce 100644 --- a/yukireflection-core/src/main/java/com/highcapable/yukireflection/finder/base/MemberBaseFinder.kt +++ b/yukireflection-core/src/main/java/com/highcapable/yukireflection/finder/base/MemberBaseFinder.kt @@ -31,8 +31,7 @@ package com.highcapable.yukireflection.finder.base import com.highcapable.yukireflection.YukiReflection -import com.highcapable.yukireflection.log.yLoggerE -import com.highcapable.yukireflection.log.yLoggerI +import com.highcapable.yukireflection.utils.debug.YukiLog import com.highcapable.yukireflection.utils.factory.await import java.lang.reflect.Constructor import java.lang.reflect.Field @@ -115,7 +114,7 @@ abstract class MemberBaseFinder internal constructor( /** 存在日志时输出日志 */ internal fun printLogIfExist() { - if (loggingContent != null) yLoggerE( + if (loggingContent != null) YukiLog.error( msg = "NoSuch$tag happend in [$classSet] ${loggingContent?.first}", e = loggingContent?.second ) @@ -128,6 +127,6 @@ abstract class MemberBaseFinder internal constructor( * @param msg 调试日志内容 */ internal fun onDebuggingMsg(msg: String) { - if (YukiReflection.Configs.isDebug) yLoggerI(msg) + if (YukiReflection.Configs.isDebug) YukiLog.debug(msg) } } \ No newline at end of file diff --git a/yukireflection-core/src/main/java/com/highcapable/yukireflection/finder/classes/DexClassFinder.kt b/yukireflection-core/src/main/java/com/highcapable/yukireflection/finder/classes/DexClassFinder.kt index b11cafb..d139282 100644 --- a/yukireflection-core/src/main/java/com/highcapable/yukireflection/finder/classes/DexClassFinder.kt +++ b/yukireflection-core/src/main/java/com/highcapable/yukireflection/finder/classes/DexClassFinder.kt @@ -48,7 +48,7 @@ import com.highcapable.yukireflection.finder.classes.rules.result.MemberRulesRes import com.highcapable.yukireflection.finder.tools.ReflectionTool import com.highcapable.yukireflection.finder.type.factory.ModifierConditions import com.highcapable.yukireflection.finder.type.factory.NameConditions -import com.highcapable.yukireflection.log.yLoggerW +import com.highcapable.yukireflection.utils.debug.YukiLog import com.highcapable.yukireflection.utils.factory.await import com.highcapable.yukireflection.utils.factory.runBlocking import com.highcapable.yukireflection.utils.factory.toStackTrace @@ -93,7 +93,7 @@ class DexClassFinder @PublishedApi internal constructor( ?.let { "${CACHE_FILE_NAME}_${versionName ?: it.versionName}_${versionCode ?: runCatching { it.longVersionCode }.getOrNull() ?: it.versionCode}" } ?: "${CACHE_FILE_NAME}_unknown", Context.MODE_PRIVATE) - }.onFailure { yLoggerW(msg = "Failed to read app's SharedPreferences when using DexClassFinder\n${it.toStackTrace()}") }.getOrNull() + }.onFailure { YukiLog.warn(msg = "Failed to read app's SharedPreferences when using DexClassFinder\n${it.toStackTrace()}") }.getOrNull() /** * 清除当前 [DexClassFinder] 的 [Class] 缓存 @@ -104,7 +104,7 @@ class DexClassFinder @PublishedApi internal constructor( * @param versionCode 版本号 - 默认空 */ fun clearCache(context: Context, versionName: String? = null, versionCode: Long? = null) = - context.currentSp(versionName, versionCode)?.edit()?.clear()?.apply() ?: yLoggerW(msg = "Failed to clear DexClassFinder's cache") + context.currentSp(versionName, versionCode)?.edit()?.clear()?.apply() ?: YukiLog.warn(msg = "Failed to clear DexClassFinder's cache") } @PublishedApi @@ -454,7 +454,7 @@ class DexClassFinder @PublishedApi internal constructor( takeIf { it.isNotEmpty() }?.forEach { names.add(it.name) } context?.also { if (it.packageName == "android") error("Cannot create classes cache for \"android\", please remove \"name\" param") - it.currentSp()?.edit()?.apply { putStringSet(name, names) }?.apply() ?: yLoggerW(msg = "Failed to use caching in DexClassFinder") + it.currentSp()?.edit()?.apply { putStringSet(name, names) }?.apply() ?: YukiLog.warn(msg = "Failed to use caching in DexClassFinder") } } } diff --git a/yukireflection-core/src/main/java/com/highcapable/yukireflection/finder/members/ConstructorFinder.kt b/yukireflection-core/src/main/java/com/highcapable/yukireflection/finder/members/ConstructorFinder.kt index 663c4cf..14bc93b 100644 --- a/yukireflection-core/src/main/java/com/highcapable/yukireflection/finder/members/ConstructorFinder.kt +++ b/yukireflection-core/src/main/java/com/highcapable/yukireflection/finder/members/ConstructorFinder.kt @@ -41,9 +41,9 @@ import com.highcapable.yukireflection.finder.type.factory.ConstructorConditions import com.highcapable.yukireflection.finder.type.factory.CountConditions import com.highcapable.yukireflection.finder.type.factory.ModifierConditions import com.highcapable.yukireflection.finder.type.factory.ObjectsConditions -import com.highcapable.yukireflection.log.yLoggerW import com.highcapable.yukireflection.type.defined.UndefinedType import com.highcapable.yukireflection.type.defined.VagueType +import com.highcapable.yukireflection.utils.debug.YukiLog import com.highcapable.yukireflection.utils.factory.runBlocking import java.lang.reflect.Constructor @@ -319,7 +319,7 @@ class ConstructorFinder @PublishedApi internal constructor(@PublishedApi overrid ) remedyPlans.clear() } - } else yLoggerW(msg = "RemedyPlan is empty, forgot it?") + } else YukiLog.warn(msg = "RemedyPlan is empty, forgot it?") } /** diff --git a/yukireflection-core/src/main/java/com/highcapable/yukireflection/finder/members/FieldFinder.kt b/yukireflection-core/src/main/java/com/highcapable/yukireflection/finder/members/FieldFinder.kt index 821cf38..b96205c 100644 --- a/yukireflection-core/src/main/java/com/highcapable/yukireflection/finder/members/FieldFinder.kt +++ b/yukireflection-core/src/main/java/com/highcapable/yukireflection/finder/members/FieldFinder.kt @@ -43,7 +43,7 @@ import com.highcapable.yukireflection.finder.type.factory.FieldConditions import com.highcapable.yukireflection.finder.type.factory.ModifierConditions import com.highcapable.yukireflection.finder.type.factory.NameConditions import com.highcapable.yukireflection.finder.type.factory.ObjectConditions -import com.highcapable.yukireflection.log.yLoggerW +import com.highcapable.yukireflection.utils.debug.YukiLog import com.highcapable.yukireflection.utils.factory.runBlocking import java.lang.reflect.Field @@ -277,7 +277,7 @@ class FieldFinder @PublishedApi internal constructor(@PublishedApi override val ) remedyPlans.clear() } - } else yLoggerW(msg = "RemedyPlan is empty, forgot it?") + } else YukiLog.warn(msg = "RemedyPlan is empty, forgot it?") } /** diff --git a/yukireflection-core/src/main/java/com/highcapable/yukireflection/finder/members/MethodFinder.kt b/yukireflection-core/src/main/java/com/highcapable/yukireflection/finder/members/MethodFinder.kt index 323f6ac..107e970 100644 --- a/yukireflection-core/src/main/java/com/highcapable/yukireflection/finder/members/MethodFinder.kt +++ b/yukireflection-core/src/main/java/com/highcapable/yukireflection/finder/members/MethodFinder.kt @@ -43,9 +43,9 @@ import com.highcapable.yukireflection.finder.type.factory.ModifierConditions import com.highcapable.yukireflection.finder.type.factory.NameConditions import com.highcapable.yukireflection.finder.type.factory.ObjectConditions import com.highcapable.yukireflection.finder.type.factory.ObjectsConditions -import com.highcapable.yukireflection.log.yLoggerW import com.highcapable.yukireflection.type.defined.UndefinedType import com.highcapable.yukireflection.type.defined.VagueType +import com.highcapable.yukireflection.utils.debug.YukiLog import com.highcapable.yukireflection.utils.factory.runBlocking import java.lang.reflect.Method @@ -411,7 +411,7 @@ class MethodFinder @PublishedApi internal constructor(@PublishedApi override val ) remedyPlans.clear() } - } else yLoggerW(msg = "RemedyPlan is empty, forgot it?") + } else YukiLog.warn(msg = "RemedyPlan is empty, forgot it?") } /** diff --git a/yukireflection-core/src/main/java/com/highcapable/yukireflection/finder/tools/ReflectionTool.kt b/yukireflection-core/src/main/java/com/highcapable/yukireflection/finder/tools/ReflectionTool.kt index a6c36da..e413cb6 100644 --- a/yukireflection-core/src/main/java/com/highcapable/yukireflection/finder/tools/ReflectionTool.kt +++ b/yukireflection-core/src/main/java/com/highcapable/yukireflection/finder/tools/ReflectionTool.kt @@ -43,13 +43,13 @@ import com.highcapable.yukireflection.finder.members.data.ConstructorRulesData import com.highcapable.yukireflection.finder.members.data.FieldRulesData import com.highcapable.yukireflection.finder.members.data.MemberRulesData import com.highcapable.yukireflection.finder.members.data.MethodRulesData -import com.highcapable.yukireflection.log.yLoggerW import com.highcapable.yukireflection.type.defined.UndefinedType import com.highcapable.yukireflection.type.defined.VagueType import com.highcapable.yukireflection.type.java.DalvikBaseDexClassLoader import com.highcapable.yukireflection.type.java.NoClassDefFoundErrorClass import com.highcapable.yukireflection.type.java.NoSuchFieldErrorClass import com.highcapable.yukireflection.type.java.NoSuchMethodErrorClass +import com.highcapable.yukireflection.utils.debug.YukiLog import com.highcapable.yukireflection.utils.factory.conditions import com.highcapable.yukireflection.utils.factory.findLastIndex import com.highcapable.yukireflection.utils.factory.lastIndex @@ -204,7 +204,7 @@ internal object ReflectionTool { fun MemberRulesData.exists(vararg type: Any?): Boolean { if (type.isEmpty()) return true for (i in type.indices) if (type[i] == UndefinedType) { - yLoggerW(msg = "$objectName type[$i] mistake, it will be ignored in current conditions") + YukiLog.warn(msg = "$objectName type[$i] mistake, it will be ignored in current conditions") return false } return true @@ -668,7 +668,7 @@ internal object ReflectionTool { addAll(declaredConstructors.toList()) }.asSequence() }.onFailure { - yLoggerW(msg = "Failed to get the declared Members in [$this] because got an exception\n$it") + YukiLog.warn(msg = "Failed to get the declared Members in [$this] because got an exception\n$it") }.getOrNull() /** @@ -677,7 +677,7 @@ internal object ReflectionTool { */ private val Class<*>.existFields get() = runCatching { declaredFields.asSequence() }.onFailure { - yLoggerW(msg = "Failed to get the declared Fields in [$this] because got an exception\n$it") + YukiLog.warn(msg = "Failed to get the declared Fields in [$this] because got an exception\n$it") }.getOrNull() /** @@ -686,7 +686,7 @@ internal object ReflectionTool { */ private val Class<*>.existMethods get() = runCatching { declaredMethods.asSequence() }.onFailure { - yLoggerW(msg = "Failed to get the declared Methods in [$this] because got an exception\n$it") + YukiLog.warn(msg = "Failed to get the declared Methods in [$this] because got an exception\n$it") }.getOrNull() /** @@ -695,7 +695,7 @@ internal object ReflectionTool { */ private val Class<*>.existConstructors get() = runCatching { declaredConstructors.asSequence() }.onFailure { - yLoggerW(msg = "Failed to get the declared Constructors in [$this] because got an exception\n$it") + YukiLog.warn(msg = "Failed to get the declared Constructors in [$this] because got an exception\n$it") }.getOrNull() /** diff --git a/yukireflection-core/src/main/java/com/highcapable/yukireflection/log/LoggerFactory.kt b/yukireflection-core/src/main/java/com/highcapable/yukireflection/log/LoggerFactory.kt deleted file mode 100644 index 752462e..0000000 --- a/yukireflection-core/src/main/java/com/highcapable/yukireflection/log/LoggerFactory.kt +++ /dev/null @@ -1,67 +0,0 @@ -/* - * YukiReflection - An efficient Reflection API for Java and Android built in Kotlin. - * Copyright (C) 2019-2023 HighCapable - * https://github.com/fankes/YukiReflection - * - * MIT License - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - * This file is created by fankes on 2022/2/3. - * This file is modified by fankes on 2023/1/21. - */ -@file:Suppress("unused", "MemberVisibilityCanBePrivate") - -package com.highcapable.yukireflection.log - -import android.util.Log -import com.highcapable.yukireflection.YukiReflection - -/** - * 向控制台打印日志 - D - * @param msg 日志打印的内容 - */ -internal fun yLoggerD(msg: String) { - if (YukiReflection.Configs.isAllowPrintingLogs) Log.d(YukiReflection.Configs.debugTag, msg) -} - -/** - * 向控制台打印日志 - I - * @param msg 日志打印的内容 - */ -internal fun yLoggerI(msg: String) { - if (YukiReflection.Configs.isAllowPrintingLogs) Log.i(YukiReflection.Configs.debugTag, msg) -} - -/** - * 向控制台打印日志 - W - * @param msg 日志打印的内容 - */ -internal fun yLoggerW(msg: String) { - if (YukiReflection.Configs.isAllowPrintingLogs) Log.w(YukiReflection.Configs.debugTag, msg) -} - -/** - * 向控制台打印日志 - E - * @param msg 日志打印的内容 - * @param e 可填入异常堆栈信息 - 将自动完整打印到控制台 - */ -internal fun yLoggerE(msg: String, e: Throwable? = null) { - if (YukiReflection.Configs.isAllowPrintingLogs) Log.e(YukiReflection.Configs.debugTag, msg, e) -} \ No newline at end of file diff --git a/yukireflection-core/src/main/java/com/highcapable/yukireflection/utils/debug/YukiLog.kt b/yukireflection-core/src/main/java/com/highcapable/yukireflection/utils/debug/YukiLog.kt new file mode 100644 index 0000000..4596f28 --- /dev/null +++ b/yukireflection-core/src/main/java/com/highcapable/yukireflection/utils/debug/YukiLog.kt @@ -0,0 +1,117 @@ +/* + * YukiReflection - An efficient Reflection API for Java and Android built in Kotlin. + * Copyright (C) 2019-2023 HighCapable + * https://github.com/fankes/YukiReflection + * + * MIT License + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * This file is created by fankes on 2023/9/23. + */ +package com.highcapable.yukireflection.utils.debug + +import android.util.Log +import com.highcapable.yukireflection.YukiReflection +import com.highcapable.yukireflection.factory.hasClass +import com.highcapable.yukireflection.utils.factory.toStackTrace + +/** + * 全局 Log 管理类 + */ +internal object YukiLog { + + /** + * 是否为 Android 模式 + * @return [Boolean] + */ + private val isAndroidMode get() = "android.util.Log".hasClass() + + /** + * 是否启用 + * @return [Boolean] + */ + private val isEnable get() = YukiReflection.Configs.isEnableLogs + + /** + * Log 标签 + * @return [String] + */ + private val tag get() = YukiReflection.Configs.debugTag + + /** + * 打印 Debug 级别 Log + * @param msg 消息内容 + * @param e 异常堆栈 - 默认空 + */ + internal fun debug(msg: String, e: Throwable? = null) { + if (isEnable.not()) return + if (isAndroidMode) Log.d(tag, msg, e) + else log(msg = "[$tag] $msg", e) + } + + /** + * 打印 Info 级别 Log + * @param msg 消息内容 + * @param e 异常堆栈 - 默认空 + */ + internal fun info(msg: String, e: Throwable? = null) { + if (isEnable.not()) return + if (isAndroidMode) Log.i(tag, msg, e) + else log(msg = "[$tag] $msg", e, color = "38;5;10") + } + + /** + * 打印 Warn 级别 Log + * @param msg 消息内容 + * @param e 异常堆栈 - 默认空 + */ + internal fun warn(msg: String, e: Throwable? = null) { + if (isEnable.not()) return + if (isAndroidMode) Log.w(tag, msg, e) + else log(msg = "[$tag] $msg", e, color = "33") + } + + /** + * 打印 Error 级别 Log + * @param msg 消息内容 + * @param e 异常堆栈 - 默认空 + */ + internal fun error(msg: String, e: Throwable? = null) { + if (isEnable.not()) return + if (isAndroidMode) Log.e(tag, msg, e) + else log(msg = "[$tag] $msg", e, color = "31") + } + + /** + * 打印 Log + * @param msg 消息内容 + * @param e 异常堆栈 - 默认空 + * @param color 颜色代码 - 默认无颜色 + */ + private fun log(msg: String, e: Throwable? = null, color: String = "") { + /** + * 打印 Log + * @param msg 消息内容 + */ + fun innerLog(msg: String) = if (color.isBlank()) println(msg) else println("\u001B[${color}m$msg\u001B[0m") + innerLog(msg) + e?.also { innerLog(it.toStackTrace()) } + } +} \ No newline at end of file