diff --git a/docs-source/src/en/api/public/com/highcapable/yukihookapi/hook/core/finder/members/ConstructorFinder.md b/docs-source/src/en/api/public/com/highcapable/yukihookapi/hook/core/finder/members/ConstructorFinder.md index 67647bce..32a2fbdb 100644 --- a/docs-source/src/en/api/public/com/highcapable/yukihookapi/hook/core/finder/members/ConstructorFinder.md +++ b/docs-source/src/en/api/public/com/highcapable/yukihookapi/hook/core/finder/members/ConstructorFinder.md @@ -13,7 +13,7 @@ You can use the **Chrome Translation Plugin** to translate entire pages for refe # ConstructorFinder - class ```kotlin:no-line-numbers -class ConstructorFinder internal constructor(override val hookInstance: YukiMemberHookCreator.MemberHookCreator?, override val classSet: Class<*>) : MemberBaseFinder +class ConstructorFinder internal constructor(override val classSet: Class<*>) : MemberBaseFinder ``` **Change Records** @@ -28,6 +28,10 @@ class ConstructorFinder internal constructor(override val hookInstance: YukiMemb 合并到 `MemberBaseFinder` +`v1.1.7` `modified` + +移动 `hookInstance` 参数到 `MemberBaseFinder.MemberHookerManager` + **Function Illustrate** > `Constructor` 查找类。 @@ -328,7 +332,7 @@ inner class Process internal constructor(internal val isNoSuch: Boolean, interna **Function Illustrate** -> `Constructor` 查找结果处理类,为 `hookInstance` 提供。 +> `Constructor` 查找结果处理类,为 `hookManager` 提供。 ### result - method @@ -372,7 +376,7 @@ fun all(): Process **Function Illustrate** -> 设置全部查找条件匹配的多个 `Constructor` 实例结果到 `hookInstance`。 +> 设置全部查找条件匹配的多个 `Constructor` 实例结果到 `hookManager`。 ### remedys - method @@ -723,7 +727,7 @@ fun ignored(): Result > 忽略异常并停止打印任何错误日志。 -若 `isNotIgnoredHookingFailure` 为 `false` 则自动忽略。 +若 `MemberBaseFinder.MemberHookerManager.isNotIgnoredNoSuchMemberFailure` 为 `false` 则自动忽略。 ::: warning diff --git a/docs-source/src/en/api/public/com/highcapable/yukihookapi/hook/core/finder/members/FieldFinder.md b/docs-source/src/en/api/public/com/highcapable/yukihookapi/hook/core/finder/members/FieldFinder.md index 394487d8..e190eb97 100644 --- a/docs-source/src/en/api/public/com/highcapable/yukihookapi/hook/core/finder/members/FieldFinder.md +++ b/docs-source/src/en/api/public/com/highcapable/yukihookapi/hook/core/finder/members/FieldFinder.md @@ -13,7 +13,7 @@ You can use the **Chrome Translation Plugin** to translate entire pages for refe # FieldFinder - class ```kotlin:no-line-numbers -class FieldFinder internal constructor(override val hookInstance: YukiMemberHookCreator.MemberHookCreator?, override val classSet: Class<*>?) : MemberBaseFinder +class FieldFinder internal constructor(override val classSet: Class<*>?) : MemberBaseFinder ``` **Change Records** @@ -28,6 +28,10 @@ class FieldFinder internal constructor(override val hookInstance: YukiMemberHook 合并到 `MemberBaseFinder` +`v1.1.7` `modified` + +移动 `hookInstance` 参数到 `MemberBaseFinder.MemberHookerManager` + **Function Illustrate** > `Field` 查找类。 @@ -582,7 +586,7 @@ fun ignored(): Result > 忽略异常并停止打印任何错误日志。 -若 `isNotIgnoredHookingFailure` 为 `false` 则自动忽略。 +若 `MemberBaseFinder.MemberHookerManager.isNotIgnoredNoSuchMemberFailure` 为 `false` 则自动忽略。 ::: warning diff --git a/docs-source/src/en/api/public/com/highcapable/yukihookapi/hook/core/finder/members/MethodFinder.md b/docs-source/src/en/api/public/com/highcapable/yukihookapi/hook/core/finder/members/MethodFinder.md index d2aca4af..64e5f348 100644 --- a/docs-source/src/en/api/public/com/highcapable/yukihookapi/hook/core/finder/members/MethodFinder.md +++ b/docs-source/src/en/api/public/com/highcapable/yukihookapi/hook/core/finder/members/MethodFinder.md @@ -13,7 +13,7 @@ You can use the **Chrome Translation Plugin** to translate entire pages for refe # MethodFinder - class ```kotlin:no-line-numbers -class MethodFinder internal constructor(override val hookInstance: YukiMemberHookCreator.MemberHookCreator?, override val classSet: Class<*>) : MemberBaseFinder +class MethodFinder internal constructor(override val classSet: Class<*>) : MemberBaseFinder ``` **Change Records** @@ -28,6 +28,10 @@ class MethodFinder internal constructor(override val hookInstance: YukiMemberHoo 合并到 `MemberBaseFinder` +`v1.1.7` `modified` + +移动 `hookInstance` 参数到 `MemberBaseFinder.MemberHookerManager` + **Function Illustrate** > `Method` 查找类。 @@ -472,7 +476,7 @@ inner class Process internal constructor(internal val isNoSuch: Boolean, interna **Function Illustrate** -> `Method` 查找结果处理类,为 `hookInstance` 提供。 +> `Method` 查找结果处理类,为 `hookManager` 提供。 ### result - method @@ -516,7 +520,7 @@ fun all(): Process **Function Illustrate** -> 设置全部查找条件匹配的多个 `Method` 实例结果到 `hookInstance`。 +> 设置全部查找条件匹配的多个 `Method` 实例结果到 `hookManager`。 ### remedys - method @@ -853,7 +857,7 @@ fun ignored(): Result > 忽略异常并停止打印任何错误日志。 -若 `isNotIgnoredHookingFailure` 为 `false` 则自动忽略。 +若 `MemberBaseFinder.MemberHookerManager.isNotIgnoredNoSuchMemberFailure` 为 `false` 则自动忽略。 ::: warning diff --git a/docs-source/src/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/members/ConstructorFinder.md b/docs-source/src/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/members/ConstructorFinder.md index a05707ea..761baa7e 100644 --- a/docs-source/src/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/members/ConstructorFinder.md +++ b/docs-source/src/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/members/ConstructorFinder.md @@ -5,7 +5,7 @@ pageClass: code-page # ConstructorFinder - class ```kotlin:no-line-numbers -class ConstructorFinder internal constructor(override val hookInstance: YukiMemberHookCreator.MemberHookCreator?, override val classSet: Class<*>) : MemberBaseFinder +class ConstructorFinder internal constructor(override val classSet: Class<*>) : MemberBaseFinder ``` **变更记录** @@ -20,6 +20,10 @@ class ConstructorFinder internal constructor(override val hookInstance: YukiMemb 合并到 `MemberBaseFinder` +`v1.1.7` `修改` + +移动 `hookInstance` 参数到 `MemberBaseFinder.MemberHookerManager` + **功能描述** > `Constructor` 查找类。 @@ -320,7 +324,7 @@ inner class Process internal constructor(internal val isNoSuch: Boolean, interna **功能描述** -> `Constructor` 查找结果处理类,为 `hookInstance` 提供。 +> `Constructor` 查找结果处理类,为 `hookManager` 提供。 ### result - method @@ -364,7 +368,7 @@ fun all(): Process **功能描述** -> 设置全部查找条件匹配的多个 `Constructor` 实例结果到 `hookInstance`。 +> 设置全部查找条件匹配的多个 `Constructor` 实例结果到 `hookManager`。 ### remedys - method @@ -715,7 +719,7 @@ fun ignored(): Result > 忽略异常并停止打印任何错误日志。 -若 `isNotIgnoredHookingFailure` 为 `false` 则自动忽略。 +若 `MemberBaseFinder.MemberHookerManager.isNotIgnoredNoSuchMemberFailure` 为 `false` 则自动忽略。 ::: warning diff --git a/docs-source/src/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/members/FieldFinder.md b/docs-source/src/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/members/FieldFinder.md index 9d6e76d1..035d5e52 100644 --- a/docs-source/src/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/members/FieldFinder.md +++ b/docs-source/src/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/members/FieldFinder.md @@ -5,7 +5,7 @@ pageClass: code-page # FieldFinder - class ```kotlin:no-line-numbers -class FieldFinder internal constructor(override val hookInstance: YukiMemberHookCreator.MemberHookCreator?, override val classSet: Class<*>?) : MemberBaseFinder +class FieldFinder internal constructor(override val classSet: Class<*>?) : MemberBaseFinder ``` **变更记录** @@ -20,6 +20,10 @@ class FieldFinder internal constructor(override val hookInstance: YukiMemberHook 合并到 `MemberBaseFinder` +`v1.1.7` `修改` + +移动 `hookInstance` 参数到 `MemberBaseFinder.MemberHookerManager` + **功能描述** > `Field` 查找类。 @@ -574,7 +578,7 @@ fun ignored(): Result > 忽略异常并停止打印任何错误日志。 -若 `isNotIgnoredHookingFailure` 为 `false` 则自动忽略。 +若 `MemberBaseFinder.MemberHookerManager.isNotIgnoredNoSuchMemberFailure` 为 `false` 则自动忽略。 ::: warning diff --git a/docs-source/src/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/members/MethodFinder.md b/docs-source/src/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/members/MethodFinder.md index 41ae6b4c..0660e69c 100644 --- a/docs-source/src/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/members/MethodFinder.md +++ b/docs-source/src/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/members/MethodFinder.md @@ -5,7 +5,7 @@ pageClass: code-page # MethodFinder - class ```kotlin:no-line-numbers -class MethodFinder internal constructor(override val hookInstance: YukiMemberHookCreator.MemberHookCreator?, override val classSet: Class<*>) : MemberBaseFinder +class MethodFinder internal constructor(override val classSet: Class<*>) : MemberBaseFinder ``` **变更记录** @@ -20,6 +20,10 @@ class MethodFinder internal constructor(override val hookInstance: YukiMemberHoo 合并到 `MemberBaseFinder` +`v1.1.7` `修改` + +移动 `hookInstance` 参数到 `MemberBaseFinder.MemberHookerManager` + **功能描述** > `Method` 查找类。 @@ -464,7 +468,7 @@ inner class Process internal constructor(internal val isNoSuch: Boolean, interna **功能描述** -> `Method` 查找结果处理类,为 `hookInstance` 提供。 +> `Method` 查找结果处理类,为 `hookManager` 提供。 ### result - method @@ -508,7 +512,7 @@ fun all(): Process **功能描述** -> 设置全部查找条件匹配的多个 `Method` 实例结果到 `hookInstance`。 +> 设置全部查找条件匹配的多个 `Method` 实例结果到 `hookManager`。 ### remedys - method @@ -845,7 +849,7 @@ fun ignored(): Result > 忽略异常并停止打印任何错误日志。 -若 `isNotIgnoredHookingFailure` 为 `false` 则自动忽略。 +若 `MemberBaseFinder.MemberHookerManager.isNotIgnoredNoSuchMemberFailure` 为 `false` 则自动忽略。 ::: warning diff --git a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/core/YukiMemberHookCreator.kt b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/core/YukiMemberHookCreator.kt index 25c860bf..b6f49a7e 100644 --- a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/core/YukiMemberHookCreator.kt +++ b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/core/YukiMemberHookCreator.kt @@ -371,10 +371,10 @@ class YukiMemberHookCreator @PublishedApi internal constructor( */ inline fun method(initiate: MethodConditions) = runCatching { isHookMemberSetup = true - MethodFinder(hookInstance = this, hookClass.instance).apply(initiate).apply { finder = this }.process() + MethodFinder.fromHooker(hookInstance = this, hookClass.instance).apply(initiate).apply { finder = this }.process() }.getOrElse { findingThrowable = it - MethodFinder(hookInstance = this).denied(it) + MethodFinder.fromHooker(hookInstance = this).denied(it) } /** @@ -386,10 +386,10 @@ class YukiMemberHookCreator @PublishedApi internal constructor( */ inline fun constructor(initiate: ConstructorConditions = { emptyParam() }) = runCatching { isHookMemberSetup = true - ConstructorFinder(hookInstance = this, hookClass.instance).apply(initiate).apply { finder = this }.process() + ConstructorFinder.fromHooker(hookInstance = this, hookClass.instance).apply(initiate).apply { finder = this }.process() }.getOrElse { findingThrowable = it - ConstructorFinder(hookInstance = this).denied(it) + ConstructorFinder.fromHooker(hookInstance = this).denied(it) } /** @@ -398,8 +398,8 @@ class YukiMemberHookCreator @PublishedApi internal constructor( * @return [FieldFinder.Result] */ inline fun HookParam.field(initiate: FieldConditions) = - if (hookClass.instance == null) FieldFinder(hookInstance = this@MemberHookCreator).failure(hookClass.throwable) - else FieldFinder(hookInstance = this@MemberHookCreator, hookClass.instance).apply(initiate).build() + if (hookClass.instance == null) FieldFinder.fromHooker(hookInstance = this@MemberHookCreator).failure(hookClass.throwable) + else FieldFinder.fromHooker(hookInstance = this@MemberHookCreator, hookClass.instance).apply(initiate).build() /** * 使用当前 [hookClass] 查找并得到 [Method] @@ -407,8 +407,8 @@ class YukiMemberHookCreator @PublishedApi internal constructor( * @return [MethodFinder.Result] */ inline fun HookParam.method(initiate: MethodConditions) = - if (hookClass.instance == null) MethodFinder(hookInstance = this@MemberHookCreator).failure(hookClass.throwable) - else MethodFinder(hookInstance = this@MemberHookCreator, hookClass.instance).apply(initiate).build() + if (hookClass.instance == null) MethodFinder.fromHooker(hookInstance = this@MemberHookCreator).failure(hookClass.throwable) + else MethodFinder.fromHooker(hookInstance = this@MemberHookCreator, hookClass.instance).apply(initiate).build() /** * 使用当前 [hookClass] 查找并得到 [Constructor] @@ -416,8 +416,8 @@ class YukiMemberHookCreator @PublishedApi internal constructor( * @return [ConstructorFinder.Result] */ inline fun HookParam.constructor(initiate: ConstructorConditions = { emptyParam() }) = - if (hookClass.instance == null) ConstructorFinder(hookInstance = this@MemberHookCreator).failure(hookClass.throwable) - else ConstructorFinder(hookInstance = this@MemberHookCreator, hookClass.instance).apply(initiate).build() + if (hookClass.instance == null) ConstructorFinder.fromHooker(hookInstance = this@MemberHookCreator).failure(hookClass.throwable) + else ConstructorFinder.fromHooker(hookInstance = this@MemberHookCreator, hookClass.instance).apply(initiate).build() /** * 注入要 Hook 的 [Method]、[Constructor] (嵌套 Hook) diff --git a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/core/finder/base/MemberBaseFinder.kt b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/core/finder/base/MemberBaseFinder.kt index f2f17939..8658958c 100644 --- a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/core/finder/base/MemberBaseFinder.kt +++ b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/core/finder/base/MemberBaseFinder.kt @@ -43,12 +43,10 @@ import java.lang.reflect.Method /** * 这是 [Member] 查找类功能的基本类实现 * @param tag 当前查找类的标识 - * @param hookInstance 当前 Hook 实例 * @param classSet 当前需要查找的 [Class] 实例 */ abstract class MemberBaseFinder internal constructor( private val tag: String, - @PublishedApi internal open val hookInstance: YukiMemberHookCreator.MemberHookCreator? = null, @PublishedApi internal open val classSet: Class<*>? = null ) : BaseFinder() { @@ -58,31 +56,20 @@ abstract class MemberBaseFinder internal constructor( internal const val CLASSSET_IS_NULL = "classSet is null" } + /** 当前 [MemberHookerManager] */ + @PublishedApi + internal var hookerManager = MemberHookerManager() + /** 是否使用了重查找功能 */ @PublishedApi internal var isUsingRemedyPlan = false - /** 是否将结果设置到目标 [YukiMemberHookCreator.MemberHookCreator] */ - internal var isBindToHooker = false - /** 是否开启忽略错误警告功能 */ internal var isShutErrorPrinting = false /** 当前找到的 [Member] 数组 */ internal var memberInstances = HashSet() - /** - * 获取当前使用的 TAG - * @return [String] 使用的 TAG - */ - internal val hookTag get() = hookInstance?.tag ?: "FinderMode" - - /** - * 判断是否没有设置 Hook 过程中 方法、构造方法、变量 找不到的任何异常拦截 - * @return [Boolean] 没有设置任何异常拦截 - */ - internal val isNotIgnoredNoSuchMemberFailure get() = hookInstance?.isNotIgnoredNoSuchMemberFailure ?: true - /** 需要输出的日志内容 */ private var loggingContent: Pair? = null @@ -122,13 +109,13 @@ abstract class MemberBaseFinder internal constructor( internal fun onFailureMsg(msg: String = "", throwable: Throwable? = null, isAlwaysPrint: Boolean = false) { /** 创建日志 */ fun build() { - if (isNotIgnoredNoSuchMemberFailure && isUsingRemedyPlan.not() && isShutErrorPrinting.not()) + if (hookerManager.isNotIgnoredNoSuchMemberFailure && isUsingRemedyPlan.not() && isShutErrorPrinting.not()) loggingContent = Pair(msg, throwable) } /** 判断是否为 [CLASSSET_IS_NULL] */ if (throwable?.message == CLASSSET_IS_NULL) return /** 判断绑定到 Hooker 时仅创建日志 */ - if (isBindToHooker) return await { build() }.unit() + if (hookerManager.instance != null) return await { build() }.unit() /** 判断始终输出日志或等待结果后输出日志 */ if (isAlwaysPrint) build().run { printLogIfExist() } else await { build().run { printLogIfExist() } } @@ -137,7 +124,7 @@ abstract class MemberBaseFinder internal constructor( /** 存在日志时输出日志 */ internal fun printLogIfExist() { if (loggingContent != null) yLoggerE( - msg = "NoSuch$tag happend in [$classSet] ${loggingContent?.first} [${hookTag}]", + msg = "NoSuch$tag happend in [$classSet] ${loggingContent?.first}${hookerManager.tailTag}", e = loggingContent?.second ) /** 仅输出一次 - 然后清掉日志 */ @@ -149,7 +136,8 @@ abstract class MemberBaseFinder internal constructor( * @param msg 调试日志内容 */ internal fun onDebuggingMsg(msg: String) { - if (YukiHookAPI.Configs.isDebug && HookApiCategoryHelper.hasAvailableHookApi && hookInstance != null) yLoggerI(msg = msg) + if (YukiHookAPI.Configs.isDebug && HookApiCategoryHelper.hasAvailableHookApi && hookerManager.instance != null) + yLoggerI(msg = "$msg${hookerManager.tailTag}") } /** @@ -170,4 +158,46 @@ abstract class MemberBaseFinder internal constructor( */ @YukiPrivateApi abstract fun denied(throwable: Throwable?): BaseResult + + /** + * 当前 Hooker 管理实现类 + */ + internal inner class MemberHookerManager { + + /** 当前 Hooker */ + internal var instance: YukiMemberHookCreator.MemberHookCreator? = null + + /** 当前 [Member] 是否设置到当前 Hooker */ + internal var isMemberBinded = false + + /** + * 判断是否没有设置 Hook 过程中 方法、构造方法、变量 找不到的任何异常拦截 + * @return [Boolean] 没有设置任何异常拦截 + */ + internal val isNotIgnoredNoSuchMemberFailure get() = instance?.isNotIgnoredNoSuchMemberFailure ?: true + + /** + * 获取当前日志尾部打印的 TAG 用于标识当前 Hook 实例 + * @return [String] + */ + internal val tailTag get() = instance?.tag?.let { if (it.isNotBlank()) " [$it]" else "" } ?: "" + + /** + * 绑定当前 [Member] 到当前 Hooker + * @param member 当前 [Member] + */ + internal fun bindMember(member: Member?) { + instance?.members?.clear() + member?.also { instance?.members?.add(it) } + } + + /** + * 绑定 [Member] 数组到当前 Hooker + * @param members 当前 [Member] 数组 + */ + internal fun bindMembers(members: HashSet) { + instance?.members?.clear() + members.forEach { instance?.members?.add(it) } + } + } } \ No newline at end of file diff --git a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/core/finder/members/ConstructorFinder.kt b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/core/finder/members/ConstructorFinder.kt index 3fab5b6f..f5d99cc8 100644 --- a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/core/finder/members/ConstructorFinder.kt +++ b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/core/finder/members/ConstructorFinder.kt @@ -40,7 +40,6 @@ import com.highcapable.yukihookapi.hook.core.finder.type.factory.ConstructorCond import com.highcapable.yukihookapi.hook.core.finder.type.factory.CountConditions import com.highcapable.yukihookapi.hook.core.finder.type.factory.ModifierConditions import com.highcapable.yukihookapi.hook.core.finder.type.factory.ObjectsConditions -import com.highcapable.yukihookapi.hook.factory.checkingInternal import com.highcapable.yukihookapi.hook.factory.hasExtends import com.highcapable.yukihookapi.hook.log.yLoggerW import com.highcapable.yukihookapi.hook.type.defined.UndefinedType @@ -54,13 +53,24 @@ import java.lang.reflect.Member * [Constructor] 查找类 * * 可通过指定类型查找指定 [Constructor] 或一组 [Constructor] - * @param hookInstance 当前 Hook 实例 - 填写后将自动设置 [YukiMemberHookCreator.MemberHookCreator.members] * @param classSet 当前需要查找的 [Class] 实例 */ -class ConstructorFinder @PublishedApi internal constructor( - @PublishedApi override val hookInstance: YukiMemberHookCreator.MemberHookCreator? = null, - @PublishedApi override val classSet: Class<*>? = null -) : MemberBaseFinder(tag = "Constructor", hookInstance, classSet) { +class ConstructorFinder @PublishedApi internal constructor(@PublishedApi override val classSet: Class<*>? = null) : + MemberBaseFinder(tag = "Constructor", classSet) { + + @PublishedApi + internal companion object { + + /** + * 通过 [YukiMemberHookCreator.MemberHookCreator] 创建 [Constructor] 查找类 + * @param hookInstance 当前 Hooker + * @param classSet 当前需要查找的 [Class] 实例 + * @return [ConstructorFinder] + */ + @PublishedApi + internal fun fromHooker(hookInstance: YukiMemberHookCreator.MemberHookCreator, classSet: Class<*>? = null) = + ConstructorFinder(classSet).apply { hookerManager.instance = hookInstance } + } @PublishedApi override var rulesData = ConstructorRulesData() @@ -241,36 +251,27 @@ class ConstructorFinder @PublishedApi internal constructor( /** * 设置实例 - * @param isBind 是否将结果设置到目标 [YukiMemberHookCreator.MemberHookCreator] * @param constructors 当前找到的 [Constructor] 数组 */ - private fun setInstance(isBind: Boolean, constructors: HashSet>) { + private fun setInstance(constructors: HashSet>) { memberInstances.clear() - val result = constructors.takeIf { it.isNotEmpty() }?.onEach { memberInstances.add(it) }?.first() - if (isBind) hookInstance?.members?.apply { - clear() - result?.also { add(it) } - } + constructors.takeIf { it.isNotEmpty() }?.onEach { memberInstances.add(it) } + ?.first()?.apply { if (hookerManager.isMemberBinded) hookerManager.bindMember(member = this) } } - /** - * 得到 [Constructor] 结果 - * @param isBind 是否将结果设置到目标 [YukiMemberHookCreator.MemberHookCreator] - */ - private fun build(isBind: Boolean) { + /** 得到 [Constructor] 结果 */ + private fun internalBuild() { if (classSet == null) error(CLASSSET_IS_NULL) - classSet.checkingInternal() runBlocking { - isBindToHooker = isBind - setInstance(isBind, result) + setInstance(result) }.result { ms -> - memberInstances.takeIf { it.isNotEmpty() }?.forEach { onDebuggingMsg(msg = "Find Constructor [$it] takes ${ms}ms [${hookTag}]") } + memberInstances.takeIf { it.isNotEmpty() }?.forEach { onDebuggingMsg(msg = "Find Constructor [$it] takes ${ms}ms") } } } @YukiPrivateApi override fun build() = runCatching { - build(isBind = false) + internalBuild() Result() }.getOrElse { onFailureMsg(throwable = it) @@ -279,7 +280,8 @@ class ConstructorFinder @PublishedApi internal constructor( @YukiPrivateApi override fun process() = runCatching { - build(isBind = true) + hookerManager.isMemberBinded = true + internalBuild() Process() }.getOrElse { onFailureMsg(throwable = it) @@ -311,8 +313,11 @@ class ConstructorFinder @PublishedApi internal constructor( * 若最后依然失败 - 将停止查找并输出错误日志 * @param initiate 方法体 */ - inline fun constructor(initiate: ConstructorConditions) = - Result().apply { remedyPlans.add(Pair(ConstructorFinder(hookInstance, classSet).apply(initiate), this)) } + inline fun constructor(initiate: ConstructorConditions) = Result().apply { + remedyPlans.add(Pair(ConstructorFinder(classSet).apply { + hookerManager = this@ConstructorFinder.hookerManager + }.apply(initiate), this)) + } /** 开始重查找 */ @PublishedApi @@ -324,16 +329,15 @@ class ConstructorFinder @PublishedApi internal constructor( remedyPlans.forEachIndexed { p, it -> runCatching { runBlocking { - setInstance(isBindToHooker, it.first.result) + setInstance(it.first.result) }.result { ms -> - memberInstances.takeIf { it.isNotEmpty() } - ?.forEach { onDebuggingMsg(msg = "Find Constructor [$it] takes ${ms}ms [${hookTag}]") } + memberInstances.takeIf { it.isNotEmpty() }?.forEach { onDebuggingMsg(msg = "Find Constructor [$it] takes ${ms}ms") } } isFindSuccess = true it.second.onFindCallback?.invoke(memberInstances.constructors()) remedyPlansCallback?.invoke() memberInstances.takeIf { it.isNotEmpty() } - ?.forEach { onDebuggingMsg(msg = "Constructor [$it] trying ${p + 1} times success by RemedyPlan [${hookTag}]") } + ?.forEach { onDebuggingMsg(msg = "Constructor [$it] trying ${p + 1} times success by RemedyPlan") } return@run }.onFailure { lastError = it @@ -348,7 +352,7 @@ class ConstructorFinder @PublishedApi internal constructor( ) remedyPlans.clear() } - } else yLoggerW(msg = "RemedyPlan is empty, forgot it? [${hookTag}]") + } else yLoggerW(msg = "RemedyPlan is empty, forgot it?${hookerManager.tailTag}") } /** @@ -372,7 +376,7 @@ class ConstructorFinder @PublishedApi internal constructor( } /** - * [Constructor] 查找结果处理类 - 为 [hookInstance] 提供 + * [Constructor] 查找结果处理类 - 为 [hookerManager] 提供 * @param isNoSuch 是否没有找到 [Constructor] - 默认否 * @param throwable 错误信息 */ @@ -389,14 +393,11 @@ class ConstructorFinder @PublishedApi internal constructor( inline fun result(initiate: Process.() -> Unit) = apply(initiate) /** - * 设置全部查找条件匹配的多个 [Constructor] 实例结果到 [hookInstance] + * 设置全部查找条件匹配的多个 [Constructor] 实例结果到 [hookerManager] * @return [Process] 可继续向下监听 */ fun all(): Process { - fun HashSet.bind() = takeIf { it.isNotEmpty() }?.apply { - hookInstance?.members?.clear() - forEach { hookInstance?.members?.add(it) } - }.unit() + fun HashSet.bind() = takeIf { it.isNotEmpty() }?.apply { hookerManager.bindMembers(members = this) }.unit() if (isUsingRemedyPlan) remedyPlansCallback = { memberInstances.bind() } else memberInstances.bind() @@ -554,7 +555,7 @@ class ConstructorFinder @PublishedApi internal constructor( /** * 忽略异常并停止打印任何错误日志 * - * - 若 [isNotIgnoredNoSuchMemberFailure] 为 false 则自动忽略 + * - 若 [MemberBaseFinder.MemberHookerManager.isNotIgnoredNoSuchMemberFailure] 为 false 则自动忽略 * * - ❗此时若要监听异常结果 - 你需要手动实现 [onNoSuchConstructor] 方法 * @return [Result] 可继续向下监听 diff --git a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/core/finder/members/FieldFinder.kt b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/core/finder/members/FieldFinder.kt index cae0c855..87a1b707 100644 --- a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/core/finder/members/FieldFinder.kt +++ b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/core/finder/members/FieldFinder.kt @@ -41,11 +41,9 @@ import com.highcapable.yukihookapi.hook.core.finder.type.factory.FieldConditions import com.highcapable.yukihookapi.hook.core.finder.type.factory.ModifierConditions import com.highcapable.yukihookapi.hook.core.finder.type.factory.NameConditions import com.highcapable.yukihookapi.hook.core.finder.type.factory.ObjectConditions -import com.highcapable.yukihookapi.hook.factory.checkingInternal import com.highcapable.yukihookapi.hook.factory.current import com.highcapable.yukihookapi.hook.factory.hasExtends import com.highcapable.yukihookapi.hook.log.yLoggerW -import com.highcapable.yukihookapi.hook.utils.await import com.highcapable.yukihookapi.hook.utils.runBlocking import java.lang.reflect.Field @@ -53,13 +51,24 @@ import java.lang.reflect.Field * [Field] 查找类 * * 可通过指定类型查找指定 [Field] 或一组 [Field] - * @param hookInstance 当前 Hook 实例 * @param classSet 当前需要查找的 [Class] 实例 */ -class FieldFinder @PublishedApi internal constructor( - @PublishedApi override val hookInstance: YukiMemberHookCreator.MemberHookCreator? = null, - @PublishedApi override val classSet: Class<*>? = null -) : MemberBaseFinder(tag = "Field", hookInstance, classSet) { +class FieldFinder @PublishedApi internal constructor(@PublishedApi override val classSet: Class<*>? = null) : + MemberBaseFinder(tag = "Field", classSet) { + + @PublishedApi + internal companion object { + + /** + * 通过 [YukiMemberHookCreator.MemberHookCreator] 创建 [Field] 查找类 + * @param hookInstance 当前 Hooker + * @param classSet 当前需要查找的 [Class] 实例 + * @return [FieldFinder] + */ + @PublishedApi + internal fun fromHooker(hookInstance: YukiMemberHookCreator.MemberHookCreator, classSet: Class<*>? = null) = + FieldFinder(classSet).apply { hookerManager.instance = hookInstance } + } @PublishedApi override var rulesData = FieldRulesData() @@ -205,18 +214,24 @@ class FieldFinder @PublishedApi internal constructor( fields.takeIf { it.isNotEmpty() }?.forEach { memberInstances.add(it) } } + /** 得到 [Field] 结果 */ + private fun internalBuild() { + if (classSet == null) error(CLASSSET_IS_NULL) + runBlocking { + setInstance(result) + }.result { ms -> + memberInstances.takeIf { it.isNotEmpty() }?.forEach { onDebuggingMsg(msg = "Find Field [$it] takes ${ms}ms") } + } + } + @YukiPrivateApi override fun build() = runCatching { - if (classSet != null) { - classSet.checkingInternal() - runBlocking { - setInstance(result) - }.result { ms -> - memberInstances.takeIf { it.isNotEmpty() }?.forEach { onDebuggingMsg(msg = "Find Field [$it] takes ${ms}ms [${hookTag}]") } - } - Result() - } else Result(isNoSuch = true, Throwable(CLASSSET_IS_NULL)) - }.getOrElse { e -> Result(isNoSuch = true, e).await { onFailureMsg(throwable = e) } } + internalBuild() + Result() + }.getOrElse { + onFailureMsg(throwable = it) + Result(isNoSuch = true, it) + } @YukiPrivateApi override fun process() = error("FieldFinder does not contain this usage") @@ -247,8 +262,11 @@ class FieldFinder @PublishedApi internal constructor( * @param initiate 方法体 * @return [Result] 结果 */ - inline fun field(initiate: FieldConditions) = - Result().apply { remedyPlans.add(Pair(FieldFinder(hookInstance, classSet).apply(initiate), this)) } + inline fun field(initiate: FieldConditions) = Result().apply { + remedyPlans.add(Pair(FieldFinder(classSet).apply { + hookerManager = this@FieldFinder.hookerManager + }.apply(initiate), this)) + } /** 开始重查找 */ @PublishedApi @@ -263,13 +281,13 @@ class FieldFinder @PublishedApi internal constructor( setInstance(it.first.result) }.result { ms -> memberInstances.takeIf { it.isNotEmpty() } - ?.forEach { onDebuggingMsg(msg = "Find Field [$it] takes ${ms}ms [${hookTag}]") } + ?.forEach { onDebuggingMsg(msg = "Find Field [$it] takes ${ms}ms") } } isFindSuccess = true it.second.onFindCallback?.invoke(memberInstances.fields()) remedyPlansCallback?.invoke() memberInstances.takeIf { it.isNotEmpty() } - ?.forEach { onDebuggingMsg(msg = "Field [$it] trying ${p + 1} times success by RemedyPlan [${hookTag}]") } + ?.forEach { onDebuggingMsg(msg = "Field [$it] trying ${p + 1} times success by RemedyPlan") } return@run }.onFailure { lastError = it @@ -284,7 +302,7 @@ class FieldFinder @PublishedApi internal constructor( ) remedyPlans.clear() } - } else yLoggerW(msg = "RemedyPlan is empty, forgot it? [${hookTag}]") + } else yLoggerW(msg = "RemedyPlan is empty, forgot it?${hookerManager.tailTag}") } /** @@ -440,7 +458,7 @@ class FieldFinder @PublishedApi internal constructor( /** * 忽略异常并停止打印任何错误日志 * - * - 若 [isNotIgnoredNoSuchMemberFailure] 为 false 则自动忽略 + * - 若 [MemberBaseFinder.MemberHookerManager.isNotIgnoredNoSuchMemberFailure] 为 false 则自动忽略 * * - ❗此时若要监听异常结果 - 你需要手动实现 [onNoSuchField] 方法 * @return [Result] 可继续向下监听 diff --git a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/core/finder/members/MethodFinder.kt b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/core/finder/members/MethodFinder.kt index 46525b5a..8904edbf 100644 --- a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/core/finder/members/MethodFinder.kt +++ b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/core/finder/members/MethodFinder.kt @@ -38,7 +38,6 @@ import com.highcapable.yukihookapi.hook.core.finder.base.MemberBaseFinder import com.highcapable.yukihookapi.hook.core.finder.members.data.MethodRulesData import com.highcapable.yukihookapi.hook.core.finder.tools.ReflectionTool import com.highcapable.yukihookapi.hook.core.finder.type.factory.* -import com.highcapable.yukihookapi.hook.factory.checkingInternal import com.highcapable.yukihookapi.hook.factory.hasExtends import com.highcapable.yukihookapi.hook.log.yLoggerW import com.highcapable.yukihookapi.hook.type.defined.UndefinedType @@ -52,13 +51,24 @@ import java.lang.reflect.Method * [Method] 查找类 * * 可通过指定类型查找指定 [Method] 或一组 [Method] - * @param hookInstance 当前 Hook 实例 - 填写后将自动设置 [YukiMemberHookCreator.MemberHookCreator.members] * @param classSet 当前需要查找的 [Class] 实例 */ -class MethodFinder @PublishedApi internal constructor( - @PublishedApi override val hookInstance: YukiMemberHookCreator.MemberHookCreator? = null, - @PublishedApi override val classSet: Class<*>? = null -) : MemberBaseFinder(tag = "Method", hookInstance, classSet) { +class MethodFinder @PublishedApi internal constructor(@PublishedApi override val classSet: Class<*>? = null) : + MemberBaseFinder(tag = "Method", classSet) { + + @PublishedApi + internal companion object { + + /** + * 通过 [YukiMemberHookCreator.MemberHookCreator] 创建 [Method] 查找类 + * @param hookInstance 当前 Hooker + * @param classSet 当前需要查找的 [Class] 实例 + * @return [MethodFinder] + */ + @PublishedApi + internal fun fromHooker(hookInstance: YukiMemberHookCreator.MemberHookCreator, classSet: Class<*>? = null) = + MethodFinder(classSet).apply { hookerManager.instance = hookInstance } + } @PublishedApi override var rulesData = MethodRulesData() @@ -329,36 +339,27 @@ class MethodFinder @PublishedApi internal constructor( /** * 设置实例 - * @param isBind 是否将结果设置到目标 [YukiMemberHookCreator.MemberHookCreator] * @param methods 当前找到的 [Method] 数组 */ - private fun setInstance(isBind: Boolean, methods: HashSet) { + private fun setInstance(methods: HashSet) { memberInstances.clear() - val result = methods.takeIf { it.isNotEmpty() }?.onEach { memberInstances.add(it) }?.first() - if (isBind) hookInstance?.members?.apply { - clear() - result?.also { add(it) } - } + methods.takeIf { it.isNotEmpty() }?.onEach { memberInstances.add(it) } + ?.first()?.apply { if (hookerManager.isMemberBinded) hookerManager.bindMember(member = this) } } - /** - * 得到 [Method] 结果 - * @param isBind 是否将结果设置到目标 [YukiMemberHookCreator.MemberHookCreator] - */ - private fun build(isBind: Boolean) { + /** 得到 [Method] 结果 */ + private fun internalBuild() { if (classSet == null) error(CLASSSET_IS_NULL) - classSet.checkingInternal() runBlocking { - isBindToHooker = isBind - setInstance(isBind, result) + setInstance(result) }.result { ms -> - memberInstances.takeIf { it.isNotEmpty() }?.forEach { onDebuggingMsg(msg = "Find Method [$it] takes ${ms}ms [${hookTag}]") } + memberInstances.takeIf { it.isNotEmpty() }?.forEach { onDebuggingMsg(msg = "Find Method [$it] takes ${ms}ms") } } } @YukiPrivateApi override fun build() = runCatching { - build(isBind = false) + internalBuild() Result() }.getOrElse { onFailureMsg(throwable = it) @@ -367,7 +368,8 @@ class MethodFinder @PublishedApi internal constructor( @YukiPrivateApi override fun process() = runCatching { - build(isBind = true) + hookerManager.isMemberBinded = true + internalBuild() Process() }.getOrElse { onFailureMsg(throwable = it) @@ -400,8 +402,11 @@ class MethodFinder @PublishedApi internal constructor( * @param initiate 方法体 * @return [Result] 结果 */ - inline fun method(initiate: MethodConditions) = - Result().apply { remedyPlans.add(Pair(MethodFinder(hookInstance, classSet).apply(initiate), this)) } + inline fun method(initiate: MethodConditions) = Result().apply { + remedyPlans.add(Pair(MethodFinder(classSet).apply { + hookerManager = this@MethodFinder.hookerManager + }.apply(initiate), this)) + } /** 开始重查找 */ @PublishedApi @@ -413,16 +418,15 @@ class MethodFinder @PublishedApi internal constructor( remedyPlans.forEachIndexed { p, it -> runCatching { runBlocking { - setInstance(isBindToHooker, it.first.result) + setInstance(it.first.result) }.result { ms -> - memberInstances.takeIf { it.isNotEmpty() } - ?.forEach { onDebuggingMsg(msg = "Find Method [$it] takes ${ms}ms [${hookTag}]") } + memberInstances.takeIf { it.isNotEmpty() }?.forEach { onDebuggingMsg(msg = "Find Method [$it] takes ${ms}ms") } } isFindSuccess = true it.second.onFindCallback?.invoke(memberInstances.methods()) remedyPlansCallback?.invoke() memberInstances.takeIf { it.isNotEmpty() } - ?.forEach { onDebuggingMsg(msg = "Method [$it] trying ${p + 1} times success by RemedyPlan [${hookTag}]") } + ?.forEach { onDebuggingMsg(msg = "Method [$it] trying ${p + 1} times success by RemedyPlan") } return@run }.onFailure { lastError = it @@ -437,7 +441,7 @@ class MethodFinder @PublishedApi internal constructor( ) remedyPlans.clear() } - } else yLoggerW(msg = "RemedyPlan is empty, forgot it? [${hookTag}]") + } else yLoggerW(msg = "RemedyPlan is empty, forgot it?${hookerManager.tailTag}") } /** @@ -461,7 +465,7 @@ class MethodFinder @PublishedApi internal constructor( } /** - * [Method] 查找结果处理类 - 为 [hookInstance] 提供 + * [Method] 查找结果处理类 - 为 [hookerManager] 提供 * @param isNoSuch 是否没有找 [Method] - 默认否 * @param throwable 错误信息 */ @@ -478,14 +482,11 @@ class MethodFinder @PublishedApi internal constructor( inline fun result(initiate: Process.() -> Unit) = apply(initiate) /** - * 设置全部查找条件匹配的多个 [Method] 实例结果到 [hookInstance] + * 设置全部查找条件匹配的多个 [Method] 实例结果到 [hookerManager] * @return [Process] 可继续向下监听 */ fun all(): Process { - fun HashSet.bind() = takeIf { it.isNotEmpty() }?.apply { - hookInstance?.members?.clear() - forEach { hookInstance?.members?.add(it) } - }.unit() + fun HashSet.bind() = takeIf { it.isNotEmpty() }?.apply { hookerManager.bindMembers(members = this) }.unit() if (isUsingRemedyPlan) remedyPlansCallback = { memberInstances.bind() } else memberInstances.bind() @@ -650,7 +651,7 @@ class MethodFinder @PublishedApi internal constructor( /** * 忽略异常并停止打印任何错误日志 * - * - 若 [isNotIgnoredNoSuchMemberFailure] 为 false 则自动忽略 + * - 若 [MemberBaseFinder.MemberHookerManager.isNotIgnoredNoSuchMemberFailure] 为 false 则自动忽略 * * - ❗此时若要监听异常结果 - 你需要手动实现 [onNoSuchMethod] 方法 * @return [Result] 可继续向下监听