From 6d8d7bb86e6315a77a9c38f1d06cbd06f9daca15 Mon Sep 17 00:00:00 2001 From: fankesyooni Date: Sun, 4 Sep 2022 21:21:01 +0800 Subject: [PATCH] Added Class.hasModifiers function in ReflectionFactory --- docs/api/public/ModifierRules.md | 40 +++++---- docs/api/public/ReflectionFactory.md | 14 +++ .../hook/core/finder/type/ModifierRules.kt | 86 ++++++++++++------- .../hook/factory/ReflectionFactory.kt | 7 ++ 4 files changed, 96 insertions(+), 51 deletions(-) diff --git a/docs/api/public/ModifierRules.md b/docs/api/public/ModifierRules.md index 71fa50a8..35af2d48 100644 --- a/docs/api/public/ModifierRules.md +++ b/docs/api/public/ModifierRules.md @@ -8,11 +8,15 @@ class ModifierRules internal constructor() `v1.0.67` `新增` +`v1.0.93` `修改` + +新增 `Class` 的描述符判断 + **功能描述** -> 这是一个 `Member` 描述符定义类。 +> 这是一个 `Class`、`Member` 描述符定义类。 -可对 R8 混淆后的 `Member` 进行更加详细的定位。 +可对 R8 混淆后的 `Class`、`Member` 进行更加详细的定位。 ### ~~asPublic *- method*~~ @@ -146,7 +150,7 @@ fun isPublic() **功能描述** -> 添加描述 `Member` 类型包含 `public`。 +> 添加描述 `Class`、`Member` 类型包含 `public`。 ### isPrivate *- method* @@ -160,7 +164,7 @@ fun isPrivate() **功能描述** -> 添加描述 `Member` 类型包含 `private`。 +> 添加描述 `Class`、`Member` 类型包含 `private`。 ### isProtected *- method* @@ -174,7 +178,7 @@ fun isProtected() **功能描述** -> 添加描述 `Member` 类型包含 `protected`。 +> 添加描述 `Class`、`Member` 类型包含 `protected`。 ### isStatic *- method* @@ -188,9 +192,9 @@ fun isStatic() **功能描述** -> 添加描述 `Member` 类型包含 `static`。 +> 添加描述 `Class`、`Member` 类型包含 `static`。 -对于任意的静态 `Member` 可添加此描述进行确定。 +对于任意的静态 `Class`、`Member` 可添加此描述进行确定。 !> 特别注意 Kotlin -> Jvm 后的 `object` 类中的方法并不是静态的。 @@ -206,9 +210,9 @@ fun isFinal() **功能描述** -> 添加描述 `Member` 类型包含 `final`。 +> 添加描述 `Class`、`Member` 类型包含 `final`。 -!> 特别注意在 Kotlin -> Jvm 后没有 `open` 标识的 `Member` 和没有任何关联的 `Member` 都将为 `final`。 +!> 特别注意在 Kotlin -> Jvm 后没有 `open` 标识的 `Class`、`Member` 和没有任何关联的 `Class`、`Member` 都将为 `final`。 ### isSynchronized *- method* @@ -222,7 +226,7 @@ fun isSynchronized() **功能描述** -> 添加描述 `Member` 类型包含 `synchronized`。 +> 添加描述 `Class`、`Member` 类型包含 `synchronized`。 ### isVolatile *- method* @@ -236,7 +240,7 @@ fun isVolatile() **功能描述** -> 添加描述 `Member` 类型包含 `volatile`。 +> 添加描述 `Class`、`Member` 类型包含 `volatile`。 ### isTransient *- method* @@ -250,7 +254,7 @@ fun isTransient() **功能描述** -> 添加描述 `Member` 类型包含 `transient`。 +> 添加描述 `Class`、`Member` 类型包含 `transient`。 ### isNative *- method* @@ -264,9 +268,9 @@ fun isNative() **功能描述** -> 添加描述 `Member` 类型包含 `native`。 +> 添加描述 `Class`、`Member` 类型包含 `native`。 -对于任意 JNI 对接的 `Member` 可添加此描述进行确定。 +对于任意 JNI 对接的 `Class`、`Member` 可添加此描述进行确定。 ### isInterface *- method* @@ -280,7 +284,7 @@ fun isInterface() **功能描述** -> 添加描述 `Member` 类型包含 `interface`。 +> 添加描述 `Class`、`Member` 类型包含 `interface`。 ### isAbstract *- method* @@ -294,9 +298,9 @@ fun isAbstract() **功能描述** -> 添加描述 `Member` 类型包含 `abstract`。 +> 添加描述 `Class`、`Member` 类型包含 `abstract`。 -对于任意的抽象 `Member` 可添加此描述进行确定。 +对于任意的抽象 `Class`、`Member` 可添加此描述进行确定。 ### isStrict *- method* @@ -310,4 +314,4 @@ fun isStrict() **功能描述** -> 添加描述 `Member` 类型包含 `strict`。 \ No newline at end of file +> 添加描述 `Class`、`Member` 类型包含 `strict`。 \ No newline at end of file diff --git a/docs/api/public/ReflectionFactory.md b/docs/api/public/ReflectionFactory.md index 76cf99ae..4e48a9d0 100644 --- a/docs/api/public/ReflectionFactory.md +++ b/docs/api/public/ReflectionFactory.md @@ -311,6 +311,20 @@ inline fun Member.hasModifiers(initiate: ModifierRules.() -> Unit): Boolean > 查询 `Member` 中匹配的描述符。 +### Class.hasModifiers *- ext-method* + +```kotlin +inline fun Class<*>.hasModifiers(initiate: ModifierRules.() -> Unit): Boolean +``` + +**变更记录** + +`v1.0.93` `新增` + +**功能描述** + +> 查询 `Class` 中匹配的描述符。 + ### ~~obtainStaticFieldAny *- method*~~ **变更记录** diff --git a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/core/finder/type/ModifierRules.kt b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/core/finder/type/ModifierRules.kt index 904cb359..dba889b8 100644 --- a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/core/finder/type/ModifierRules.kt +++ b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/core/finder/type/ModifierRules.kt @@ -33,9 +33,9 @@ import java.lang.reflect.Member import java.lang.reflect.Modifier /** - * 这是一个 [Member] 描述符定义类 + * 这是一个 [Class]、[Member] 描述符定义类 * - * 可对 R8 混淆后的 [Member] 进行更加详细的定位 + * 可对 R8 混淆后的 [Class]、[Member] 进行更加详细的定位 */ class ModifierRules @PublishedApi internal constructor() { @@ -171,25 +171,25 @@ class ModifierRules @PublishedApi internal constructor() { @Deprecated(message = "请使用新的命名方法", replaceWith = ReplaceWith(expression = "isStrict()")) fun asStrict() = isStrict() - /** 添加描述 [Member] 类型包含 public */ + /** 添加描述 [Class]、[Member] 类型包含 public */ fun isPublic() { isPublic = true } - /** 添加描述 [Member] 类型包含 private */ + /** 添加描述 [Class]、[Member] 类型包含 private */ fun isPrivate() { isPrivate = true } - /** 添加描述 [Member] 类型包含 protected */ + /** 添加描述 [Class]、[Member] 类型包含 protected */ fun isProtected() { isProtected = true } /** - * 添加描述 [Member] 类型包含 static + * 添加描述 [Class]、[Member] 类型包含 static * - * 对于任意的静态 [Member] 可添加此描述进行确定 + * 对于任意的静态 [Class]、[Member] 可添加此描述进行确定 * * - ❗注意 Kotlin → Jvm 后的 object 类中的方法并不是静态的 */ @@ -198,77 +198,79 @@ class ModifierRules @PublishedApi internal constructor() { } /** - * 添加描述 [Member] 类型包含 final + * 添加描述 [Class]、[Member] 类型包含 final * - * - ❗注意 Kotlin → Jvm 后没有 open 标识的 [Member] 和没有任何关联的 [Member] 都将为 final + * - ❗注意 Kotlin → Jvm 后没有 open 标识的 [Class]、[Member] 和没有任何关联的 [Class]、[Member] 都将为 final */ fun isFinal() { isFinal = true } - /** 添加描述 [Member] 类型包含 synchronized */ + /** 添加描述 [Class]、[Member] 类型包含 synchronized */ fun isSynchronized() { isSynchronized = true } - /** 添加描述 [Member] 类型包含 volatile */ + /** 添加描述 [Class]、[Member] 类型包含 volatile */ fun isVolatile() { isVolatile = true } - /** 添加描述 [Member] 类型包含 transient */ + /** 添加描述 [Class]、[Member] 类型包含 transient */ fun isTransient() { isTransient = true } /** - * 添加描述 [Member] 类型包含 native + * 添加描述 [Class]、[Member] 类型包含 native * - * 对于任意 JNI 对接的 [Member] 可添加此描述进行确定 + * 对于任意 JNI 对接的 [Class]、[Member] 可添加此描述进行确定 */ fun isNative() { isNative = true } - /** 添加描述 [Member] 类型包含 interface */ + /** 添加描述 [Class]、[Member] 类型包含 interface */ fun isInterface() { isInterface = true } /** - * 添加描述 [Member] 类型包含 abstract + * 添加描述 [Class]、[Member] 类型包含 abstract * - * 对于任意的抽象 [Member] 可添加此描述进行确定 + * 对于任意的抽象 [Class]、[Member] 可添加此描述进行确定 */ fun isAbstract() { isAbstract = true } - /** 添加描述 [Member] 类型包含 strict */ + /** 添加描述 [Class]、[Member] 类型包含 strict */ fun isStrict() { isStrict = true } /** - * 对比 [Member] 类型是否符合条件 - * @param member 实例 + * 对比 [Class]、[Member] 类型是否符合条件 + * @param reflects 实例 - 只能是 [Class] or [Member] * @return [Boolean] 是否符合条件 */ @PublishedApi - internal fun contains(member: Member): Boolean { + internal fun contains(reflects: Any): Boolean { var conditions = true - if (isPublic) conditions = Modifier.isPublic(member.modifiers) - if (isPrivate) conditions = conditions && Modifier.isPrivate(member.modifiers) - if (isProtected) conditions = conditions && Modifier.isProtected(member.modifiers) - if (isStatic) conditions = conditions && Modifier.isStatic(member.modifiers) - if (isFinal) conditions = conditions && Modifier.isFinal(member.modifiers) - if (isSynchronized) conditions = conditions && Modifier.isSynchronized(member.modifiers) - if (isVolatile) conditions = conditions && Modifier.isVolatile(member.modifiers) - if (isTransient) conditions = conditions && Modifier.isTransient(member.modifiers) - if (isNative) conditions = conditions && Modifier.isNative(member.modifiers) - if (isInterface) conditions = conditions && Modifier.isInterface(member.modifiers) - if (isAbstract) conditions = conditions && Modifier.isAbstract(member.modifiers) - if (isStrict) conditions = conditions && Modifier.isStrict(member.modifiers) + Reflects(reflects).also { + if (isPublic) conditions = Modifier.isPublic(it.modifiers) + if (isPrivate) conditions = conditions && Modifier.isPrivate(it.modifiers) + if (isProtected) conditions = conditions && Modifier.isProtected(it.modifiers) + if (isStatic) conditions = conditions && Modifier.isStatic(it.modifiers) + if (isFinal) conditions = conditions && Modifier.isFinal(it.modifiers) + if (isSynchronized) conditions = conditions && Modifier.isSynchronized(it.modifiers) + if (isVolatile) conditions = conditions && Modifier.isVolatile(it.modifiers) + if (isTransient) conditions = conditions && Modifier.isTransient(it.modifiers) + if (isNative) conditions = conditions && Modifier.isNative(it.modifiers) + if (isInterface) conditions = conditions && Modifier.isInterface(it.modifiers) + if (isAbstract) conditions = conditions && Modifier.isAbstract(it.modifiers) + if (isStrict) conditions = conditions && Modifier.isStrict(it.modifiers) + } return conditions } @@ -288,4 +290,22 @@ class ModifierRules @PublishedApi internal constructor() { if (isStrict) conditions += " " return "[${conditions.trim()}]" } + + /** + * 实例化反射对象接口实现类 + * @param reflects 反射对象实例 + */ + private class Reflects(private val reflects: Any) { + + /** + * 获取当前对象的类型描述符 + * @return [Int] + */ + val modifiers + get() = when (reflects) { + is Member -> reflects.modifiers + is Class<*> -> reflects.modifiers + else -> error("Invalid reflects type") + } + } } \ No newline at end of file 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 24f3c818..9255a4c8 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 @@ -144,6 +144,13 @@ inline fun Class<*>.hasConstructor(initiate: ConstructorCondition = { emptyParam */ inline fun Member.hasModifiers(initiate: ModifierRules.() -> Unit) = ModifierRules().apply(initiate).contains(this) +/** + * 查询 [Class] 中匹配的描述符 + * @param initiate 方法体 + * @return [Boolean] 是否存在 + */ +inline fun Class<*>.hasModifiers(initiate: ModifierRules.() -> Unit) = ModifierRules().apply(initiate).contains(this) + /** * 查找并得到变量 * @param initiate 查找方法体