Modify change hooker functions to MemberBaseFinder.MemberHookerManager in FieldFinder, MethodFinder, ConstructorFinder, MemberBaseFinder

This commit is contained in:
2023-02-01 01:52:55 +08:00
parent 2b1acf896e
commit 476ce48d1f
11 changed files with 224 additions and 150 deletions

View File

@@ -13,7 +13,7 @@ You can use the **Chrome Translation Plugin** to translate entire pages for refe
# ConstructorFinder <span class="symbol">- class</span>
```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 <span class="symbol">- method</span>
@@ -372,7 +376,7 @@ fun all(): Process
**Function Illustrate**
> 设置全部查找条件匹配的多个 `Constructor` 实例结果到 `hookInstance`。
> 设置全部查找条件匹配的多个 `Constructor` 实例结果到 `hookManager`。
### remedys <span class="symbol">- method</span>
@@ -723,7 +727,7 @@ fun ignored(): Result
> 忽略异常并停止打印任何错误日志。
若 `isNotIgnoredHookingFailure` 为 `false` 则自动忽略。
若 `MemberBaseFinder.MemberHookerManager.isNotIgnoredNoSuchMemberFailure` 为 `false` 则自动忽略。
::: warning

View File

@@ -13,7 +13,7 @@ You can use the **Chrome Translation Plugin** to translate entire pages for refe
# FieldFinder <span class="symbol">- class</span>
```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

View File

@@ -13,7 +13,7 @@ You can use the **Chrome Translation Plugin** to translate entire pages for refe
# MethodFinder <span class="symbol">- class</span>
```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 <span class="symbol">- method</span>
@@ -516,7 +520,7 @@ fun all(): Process
**Function Illustrate**
> 设置全部查找条件匹配的多个 `Method` 实例结果到 `hookInstance`。
> 设置全部查找条件匹配的多个 `Method` 实例结果到 `hookManager`。
### remedys <span class="symbol">- method</span>
@@ -853,7 +857,7 @@ fun ignored(): Result
> 忽略异常并停止打印任何错误日志。
若 `isNotIgnoredHookingFailure` 为 `false` 则自动忽略。
若 `MemberBaseFinder.MemberHookerManager.isNotIgnoredNoSuchMemberFailure` 为 `false` 则自动忽略。
::: warning

View File

@@ -5,7 +5,7 @@ pageClass: code-page
# ConstructorFinder <span class="symbol">- class</span>
```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 <span class="symbol">- method</span>
@@ -364,7 +368,7 @@ fun all(): Process
**功能描述**
> 设置全部查找条件匹配的多个 `Constructor` 实例结果到 `hookInstance`。
> 设置全部查找条件匹配的多个 `Constructor` 实例结果到 `hookManager`。
### remedys <span class="symbol">- method</span>
@@ -715,7 +719,7 @@ fun ignored(): Result
> 忽略异常并停止打印任何错误日志。
若 `isNotIgnoredHookingFailure` 为 `false` 则自动忽略。
若 `MemberBaseFinder.MemberHookerManager.isNotIgnoredNoSuchMemberFailure` 为 `false` 则自动忽略。
::: warning

View File

@@ -5,7 +5,7 @@ pageClass: code-page
# FieldFinder <span class="symbol">- class</span>
```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

View File

@@ -5,7 +5,7 @@ pageClass: code-page
# MethodFinder <span class="symbol">- class</span>
```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 <span class="symbol">- method</span>
@@ -508,7 +512,7 @@ fun all(): Process
**功能描述**
> 设置全部查找条件匹配的多个 `Method` 实例结果到 `hookInstance`。
> 设置全部查找条件匹配的多个 `Method` 实例结果到 `hookManager`。
### remedys <span class="symbol">- method</span>
@@ -845,7 +849,7 @@ fun ignored(): Result
> 忽略异常并停止打印任何错误日志。
若 `isNotIgnoredHookingFailure` 为 `false` 则自动忽略。
若 `MemberBaseFinder.MemberHookerManager.isNotIgnoredNoSuchMemberFailure` 为 `false` 则自动忽略。
::: warning

View File

@@ -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)

View File

@@ -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<Member>()
/**
* 获取当前使用的 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<String, Throwable?>? = 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<Member>) {
instance?.members?.clear()
members.forEach { instance?.members?.add(it) }
}
}
}

View File

@@ -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<Constructor<*>>) {
private fun setInstance(constructors: HashSet<Constructor<*>>) {
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<Member>.bind() = takeIf { it.isNotEmpty() }?.apply {
hookInstance?.members?.clear()
forEach { hookInstance?.members?.add(it) }
}.unit()
fun HashSet<Member>.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] 可继续向下监听

View File

@@ -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] 可继续向下监听

View File

@@ -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<Method>) {
private fun setInstance(methods: HashSet<Method>) {
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<Member>.bind() = takeIf { it.isNotEmpty() }?.apply {
hookInstance?.members?.clear()
forEach { hookInstance?.members?.add(it) }
}.unit()
fun HashSet<Member>.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] 可继续向下监听