fix: HookParam call timing problem and refactor HookParam

This commit is contained in:
2023-10-02 01:15:35 +08:00
parent 460ac083b0
commit e813aaf97a
4 changed files with 24 additions and 27 deletions

View File

@@ -13,7 +13,7 @@ You can use the **Chrome Translation Plugin** to translate entire pages for refe
# HookParam <span class="symbol">- class</span>
```kotlin:no-line-numbers
class HookParam internal constructor(
class HookParam private constructor(
private val creatorInstance: YukiMemberHookCreator,
private var paramId: String,
private var param: YukiHookCallback.Param?
@@ -34,6 +34,10 @@ class HookParam internal constructor(
新增 `paramId` 参数
`v1.2.0` `modified`
不再开放构造方法
**Function Illustrate**
> Hook 方法、构造方法的目标对象实现类。

View File

@@ -5,7 +5,7 @@ pageClass: code-page
# HookParam <span class="symbol">- class</span>
```kotlin:no-line-numbers
class HookParam internal constructor(
class HookParam private constructor(
private val creatorInstance: YukiMemberHookCreator,
private var paramId: String,
private var param: YukiHookCallback.Param?
@@ -26,6 +26,10 @@ class HookParam internal constructor(
新增 `paramId` 参数
`v1.2.0` `修改`
不再开放构造方法
**功能描述**
> Hook 方法、构造方法的目标对象实现类。

View File

@@ -585,13 +585,10 @@ class YukiMemberHookCreator internal constructor(private val packageParam: Packa
* @return [YukiHookResult]
*/
private fun Member.hook(): YukiHookResult {
/** 定义替换 Hook 的 [HookParam] */
val replaceHookParam = HookParam(creatorInstance = this@YukiMemberHookCreator)
/** 定义替换 Hook 回调方法体 */
val replaceMent = object : YukiMemberReplacement(priority.toPriority()) {
override fun replaceHookedMember(param: Param) =
replaceHookParam.assign(replaceHookId, param).let { assign ->
HookParam.create(this@YukiMemberHookCreator, replaceHookId, param).let { assign ->
runCatching {
replaceHookCallback?.invoke(assign).also {
checkingReturnType((param.member as? Method?)?.returnType, it?.javaClass)
@@ -608,16 +605,10 @@ class YukiMemberHookCreator internal constructor(private val packageParam: Packa
}
}
/** 定义前 Hook 的 [HookParam] */
val beforeHookParam = HookParam(creatorInstance = this@YukiMemberHookCreator)
/** 定义后 Hook 的 [HookParam] */
val afterHookParam = HookParam(creatorInstance = this@YukiMemberHookCreator)
/** 定义前后 Hook 回调方法体 */
val beforeAfterHook = object : YukiMemberHook(priority.toPriority()) {
override fun beforeHookedMember(param: Param) {
beforeHookParam.assign(beforeHookId, param).also { assign ->
HookParam.create(this@YukiMemberHookCreator, beforeHookId, param).also { assign ->
runCatching {
beforeHookCallback?.invoke(assign)
checkingReturnType((param.member as? Method?)?.returnType, param.result?.javaClass)
@@ -633,7 +624,7 @@ class YukiMemberHookCreator internal constructor(private val packageParam: Packa
}
override fun afterHookedMember(param: Param) {
afterHookParam.assign(afterHookId, param).also { assign ->
HookParam.create(this@YukiMemberHookCreator, afterHookId, param).also { assign ->
runCatching {
afterHookCallback?.invoke(assign)
if (afterHookCallback != null) YLog.innerD("After Hook Member [${this@hook}] done [$tag]")

View File

@@ -46,7 +46,7 @@ import java.lang.reflect.Method
* @param paramId 当前回调方法体 ID
* @param param Hook 结果回调接口
*/
class HookParam internal constructor(
class HookParam private constructor(
private val creatorInstance: YukiMemberHookCreator,
private var paramId: String = "",
private var param: YukiHookCallback.Param? = null
@@ -60,24 +60,22 @@ class HookParam internal constructor(
/** [HookParam] 是否已经执行首次回调事件 */
internal var isCallbackCalled = false
/**
* 创建新的 [HookParam]
* @param creatorInstance [YukiMemberHookCreator] 的实例对象
* @param paramId 当前回调方法体 ID
* @param param Hook 结果回调接口
* @return [HookParam]
*/
internal fun create(creatorInstance: YukiMemberHookCreator, paramId: String, param: YukiHookCallback.Param) =
HookParam(creatorInstance, paramId, param)
/** 设置 [HookParam] 执行首次回调事件 */
internal fun invoke() {
isCallbackCalled = true
}
}
/**
* 在回调中设置 [HookParam] 使用的 [YukiHookCallback.Param]
* @param paramId 当前回调方法体 ID
* @param param Hook 结果回调接口
* @return [HookParam]
*/
internal fun assign(paramId: String, param: YukiHookCallback.Param): HookParam {
this.paramId = paramId
this.param = param
return this
}
/**
* 获取当前 Hook 对象 [method] or [constructor] 的参数对象数组
*