diff --git a/docs/api/public/HookParam.md b/docs/api/public/HookParam.md index 22156e11..6d317477 100644 --- a/docs/api/public/HookParam.md +++ b/docs/api/public/HookParam.md @@ -355,28 +355,100 @@ args(index = 1).setTrue() args(index = 1).setFalse() ``` -### Member.invokeOriginal *- i-ext-method* +### callOriginal *- method* ```kotlin -fun Member.invokeOriginal(vararg args: Any?): Any? +fun callOriginal(): Any? +``` + +```kotlin +fun callOriginal(): T? +``` + +**变更记录** + +`v1.0.93` `新增` + +**功能描述** + +> 执行原始 `Member`。 + +调用自身未进行 Hook 的原始 `Member` 并调用原始参数执行。 + +**功能实例** + +此方法可以 `invoke` 原始未经 Hook 的 `Member` 对象,取决于原始 `Member` 的参数。 + +调用自身原始的方法不会再经过当前 `beforeHook`、`afterHook` 以及 `replaceUnit`、`replaceAny`。 + +比如我们 Hook 的这个方法被这样调用 `test("test value")`,使用此方法会调用其中的 `"test value"` 作为参数。 + +> 示例如下 + +```kotlin +injectMember { + method { + name = "test" + param(StringType) + returnType = StringType + } + afterHook { + // <方案1> 不使用泛型,不获取方法执行结果,调用将使用原方法传入的 args 自动传参 + callOriginal() + // <方案2> 使用泛型,已知方法执行结果参数类型进行 cast,假设返回值为 String,失败会返回 null,调用将使用原方法传入的 args 自动传参 + val value = callOriginal() + } +} +``` + +### invokeOriginal *- method* + +```kotlin +fun invokeOriginal(vararg args: Any?): Any? +``` + +```kotlin +fun invokeOriginal(vararg args: Any?): T? ``` **变更记录** `v1.0` `添加` +`v1.0.93` `修改` + +不再需要使用 `member.invokeOriginal` 进行调用 + **功能描述** > 执行原始 `Member`。 +调用自身未进行 Hook 的原始 `Member` 并自定义 `args` 执行。 + **功能实例** -此方法可以 `invoke` 原始未经 Hook 的 `Member` 对象,取决于原始 `Member` 的参数和类型。 +此方法可以 `invoke` 原始未经 Hook 的 `Member` 对象,可自定义需要调用的参数内容。 + +调用自身原始的方法不会再经过当前 `beforeHook`、`afterHook` 以及 `replaceUnit`、`replaceAny`。 + +比如我们 Hook 的这个方法被这样调用 `test("test value")`,使用此方法可自定义其中的 `args` 作为参数。 > 示例如下 ```kotlin -member.invokeOriginal("test value") +injectMember { + method { + name = "test" + param(StringType) + returnType = StringType + } + afterHook { + // <方案1> 不使用泛型,不获取方法执行结果 + invokeOriginal("test value") + // <方案2> 使用泛型,已知方法执行结果参数类型进行 cast,假设返回值为 String,失败会返回 null + val value = invokeOriginal("test value") + } +} ``` ### resultTrue *- method* diff --git a/docs/guide/move-to-new-api.md b/docs/guide/move-to-new-api.md index 047655f1..5b9146d3 100644 --- a/docs/guide/move-to-new-api.md +++ b/docs/guide/move-to-new-api.md @@ -127,8 +127,10 @@ afterHook { resultNull() // 向 Hook APP 抛出异常 Throwable("Fatal").throwToApp() - // 执行未经 Hook 的原始方法 - method.invokeOriginal(...) + // 执行未经 Hook 的原始方法并使用原始方法参数调用,泛型可略 + callOriginal() + // 执行未经 Hook 的原始方法并自定义方法参数调用,泛型可略 + invokeOriginal(...) } ``` diff --git a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/core/YukiMemberHookCreater.kt b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/core/YukiMemberHookCreater.kt index 5b716fd5..c88972f9 100644 --- a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/core/YukiMemberHookCreater.kt +++ b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/core/YukiMemberHookCreater.kt @@ -566,7 +566,7 @@ class YukiMemberHookCreater(@PublishedApi internal val packageParam: PackagePara onAllFailureCallback?.invoke(e) if (onConductFailureCallback == null && onAllFailureCallback == null) onHookFailureMsg(e) /** 若发生异常则会自动调用未经 Hook 的原始方法保证 Hook APP 正常运行 */ - param.member?.also { member -> param.invokeOriginalMember(member, param.args) } + assign.callOriginal() } } } diff --git a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/param/HookParam.kt b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/param/HookParam.kt index 71393717..0c28cded 100644 --- a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/param/HookParam.kt +++ b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/param/HookParam.kt @@ -34,6 +34,7 @@ import com.highcapable.yukihookapi.hook.core.YukiMemberHookCreater.MemberHookCre import com.highcapable.yukihookapi.hook.factory.classOf import com.highcapable.yukihookapi.hook.log.yLoggerE import com.highcapable.yukihookapi.hook.xposed.bridge.factory.YukiHookCallback +import com.highcapable.yukihookapi.hook.xposed.bridge.factory.YukiHookHelper import java.lang.reflect.Constructor import java.lang.reflect.Member import java.lang.reflect.Method @@ -182,11 +183,38 @@ class HookParam internal constructor(private val createrInstance: YukiMemberHook /** * 执行原始 [Member] * - * 未进行 Hook 的 [Member] - * @param args 参数实例 - * @return [T] + * 调用自身未进行 Hook 的原始 [Member] 并调用原始参数执行 + * @return [Any] or null */ - fun Member.invokeOriginal(vararg args: Any?) = param?.invokeOriginalMember(member = this, *args) as? T? + fun callOriginal() = callOriginal() + + /** + * 执行原始 [Member] + * + * 调用自身未进行 Hook 的原始 [Member] 并调用原始参数执行 + * @return [T] or null + */ + @JvmName(name = "callOriginal_Generics") + fun callOriginal() = invokeOriginal(*args) + + /** + * 执行原始 [Member] + * + * 调用自身未进行 Hook 的原始 [Member] 并自定义 [args] 执行 + * @param args 参数实例 + * @return [Any] or null + */ + fun invokeOriginal(vararg args: Any?) = invokeOriginal(*args) + + /** + * 执行原始 [Member] + * + * 调用自身未进行 Hook 的原始 [Member] 并自定义 [args] 执行 + * @param args 参数实例 + * @return [T] or null + */ + @JvmName(name = "invokeOriginal_Generics") + fun invokeOriginal(vararg args: Any?) = YukiHookHelper.invokeOriginalMember(member, instance, *args) as T? /** * 设置当前 Hook 对象方法的 [result] 返回值为 true diff --git a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/xposed/bridge/factory/YukiBridgeFactory.kt b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/xposed/bridge/factory/YukiBridgeFactory.kt index 0e78e956..dc32a568 100644 --- a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/xposed/bridge/factory/YukiBridgeFactory.kt +++ b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/xposed/bridge/factory/YukiBridgeFactory.kt @@ -187,9 +187,6 @@ internal object YukiHookHelper { override fun args(index: Int, value: Any?) { this@compat.args[index] = value } - - override fun invokeOriginalMember(member: Member, vararg args: Any?) = - YukiHookHelper.invokeOriginalMember(member, this@compat.thisObject, args) } } @@ -308,15 +305,5 @@ internal abstract class YukiHookCallback(open val priority: Int) { * @param value 参数对象实例 */ fun args(index: Int, value: Any?) - - /** - * 执行原始 [Member] - * - * 未进行 Hook 的 [Member] - * @param member 实例 - * @param args 参数实例 - * @return [Any] or null - */ - fun invokeOriginalMember(member: Member, vararg args: Any?): Any? } } \ No newline at end of file