From dcc428270f2beab8bc508fe55b66c396b8b0b90b Mon Sep 17 00:00:00 2001 From: fankesyooni Date: Fri, 12 Aug 2022 01:00:01 +0800 Subject: [PATCH] Modify add allMembers function param type and add class MembersType in ReflectionFactory --- docs/api/public/ReflectionFactory.md | 56 +++++++++++++++++++ docs/api/public/YukiMemberHookCreater.md | 4 +- .../hook/core/YukiMemberHookCreater.kt | 22 +++++--- .../hook/factory/ReflectionFactory.kt | 14 +++++ 4 files changed, 86 insertions(+), 10 deletions(-) diff --git a/docs/api/public/ReflectionFactory.md b/docs/api/public/ReflectionFactory.md index fc43fc76..5cfc255e 100644 --- a/docs/api/public/ReflectionFactory.md +++ b/docs/api/public/ReflectionFactory.md @@ -8,6 +8,62 @@ > 这是自定义 `Member` 和 `Class` 相关功能的查找匹配以及 `invoke` 的封装类。 +### MembersType [class] + +```kotlin +enum class MembersType +``` + +**变更记录** + +`v1.0.93` `新增` + +**功能描述** + +> 定义一个 `Class` 中的 `Member` 类型 + +#### ALL [enum] + +```kotlin +ALL +``` + +**变更记录** + +`v1.0.93` `新增` + +**功能描述** + +> 全部 `Method` 与 `Constructor`。 + +#### METHOD [enum] + +```kotlin +METHOD +``` + +**变更记录** + +`v1.0.93` `新增` + +**功能描述** + +> 全部 `Method`。 + +#### CONSTRUCTOR [enum] + +```kotlin +CONSTRUCTOR +``` + +**变更记录** + +`v1.0.93` `新增` + +**功能描述** + +> 全部 `Constructor`。 + ### ~~hookClass [field]~~ **变更记录** diff --git a/docs/api/public/YukiMemberHookCreater.md b/docs/api/public/YukiMemberHookCreater.md index 64802428..25c0e28b 100644 --- a/docs/api/public/YukiMemberHookCreater.md +++ b/docs/api/public/YukiMemberHookCreater.md @@ -230,12 +230,12 @@ injectMember { `v1.0.93` `作废` -请使用 `constructor().all()` 来取代它 +请使用 `allMembers(MembersType.CONSTRUCTOR)` 来取代它 #### allMembers [method] ```kotlin -fun allMembers() +fun allMembers(type: MembersType) ``` **变更记录** 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 08194abd..bf2ba779 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 @@ -237,11 +237,11 @@ class YukiMemberHookCreater(@PublishedApi internal val packageParam: PackagePara * * - ❗此方法已弃用 - 在之后的版本中将直接被删除 * - * - ❗请现在转移到 [MethodFinder] + * - ❗请现在转移到 [MethodFinder] 或 [allMembers] * @param name 方法名称 * @return [ArrayList]<[MethodFinder.Result.Instance]> */ - @Deprecated("请使用新方式来实现 Hook 所有方法", ReplaceWith(expression = "method { this.name = name }.all()")) + @Deprecated(message = "请使用新方式来实现 Hook 所有方法", ReplaceWith(expression = "method { this.name = name }.all()")) fun allMethods(name: String) = method { this.name = name }.all() /** @@ -249,11 +249,14 @@ class YukiMemberHookCreater(@PublishedApi internal val packageParam: PackagePara * * - ❗此方法已弃用 - 在之后的版本中将直接被删除 * - * - ❗请现在转移到 [ConstructorFinder] + * - ❗请现在转移到 [ConstructorFinder] 或 [allMembers] * @return [ArrayList]<[ConstructorFinder.Result.Instance]> */ - @Deprecated("请使用新方式来实现 Hook 所有构造方法", ReplaceWith(expression = "constructor().all()")) - fun allConstructors() = constructor().all() + @Deprecated( + message = "请使用新方式来实现 Hook 所有构造方法", + ReplaceWith(expression = "allMembers(MembersType.CONSTRUCTOR)", "com.highcapable.yukihookapi.hook.factory.MembersType") + ) + fun allConstructors() = allMembers(MembersType.CONSTRUCTOR) /** * 查找并 Hook [hookClass] 中的全部方法、构造方法 @@ -263,11 +266,14 @@ class YukiMemberHookCreater(@PublishedApi internal val packageParam: PackagePara * - ❗警告:无法准确处理每个方法的返回值和 param - 建议使用 [method] or [constructor] 对每个方法单独 Hook * * - ❗如果 [hookClass] 中没有方法可能会发生错误 + * @param type 过滤 [Member] 类型 - 默认为 [MembersType.ALL] */ - fun allMembers() { + fun allMembers(type: MembersType = MembersType.ALL) { members.clear() - hookClass.instance?.allConstructors { _, constructor -> members.add(constructor) } - hookClass.instance?.allMethods { _, method -> members.add(method) } + if (type == MembersType.ALL || type == MembersType.CONSTRUCTOR) + hookClass.instance?.allConstructors { _, constructor -> members.add(constructor) } + if (type == MembersType.ALL || type == MembersType.METHOD) + hookClass.instance?.allMethods { _, method -> members.add(method) } isHookMemberSetup = true } diff --git a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/factory/ReflectionFactory.kt b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/factory/ReflectionFactory.kt index 11099127..2c801a98 100644 --- a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/factory/ReflectionFactory.kt +++ b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/factory/ReflectionFactory.kt @@ -51,6 +51,20 @@ internal typealias MethodCondition = MethodFinder.() -> Unit /** 定义 [ConstructorFinder] 方法体类型 */ internal typealias ConstructorCondition = ConstructorFinder.() -> Unit +/** + * 定义一个 [Class] 中的 [Member] 类型 + */ +enum class MembersType { + /** 全部 [Method] 与 [Constructor] */ + ALL, + + /** 全部 [Method] */ + METHOD, + + /** 全部 [Constructor] */ + CONSTRUCTOR +} + /** * 当前 [Class] 是否有继承关系 - 父类是 [Any] 将被认为没有继承关系 * @return [Boolean]