diff --git a/docs-source/src/en/api/public/com/highcapable/yukihookapi/hook/factory/ReflectionFactory.md b/docs-source/src/en/api/public/com/highcapable/yukihookapi/hook/factory/ReflectionFactory.md index 451115d2..98070c15 100644 --- a/docs-source/src/en/api/public/com/highcapable/yukihookapi/hook/factory/ReflectionFactory.md +++ b/docs-source/src/en/api/public/com/highcapable/yukihookapi/hook/factory/ReflectionFactory.md @@ -237,6 +237,165 @@ val Class<*>.hasExtends: Boolean > 当前 `Class` 是否有继承关系,父类是 `Any` 将被认为没有继承关系。 +## Class?.extends - ext-method + +```kotlin:no-line-numbers +infix fun Class<*>?.extends(other: Class<*>?): Boolean +``` + +**Change Records** + +`v1.1.5` `added` + +**Function Illustrate** + +> 当前 `Class` 是否继承于 `other`。 + +如果当前 `Class` 就是 `other` 也会返回 `true`。 + +如果当前 `Class` 为 `null` 或 `other` 为 `null` 会返回 `false`。 + +**Function Example** + +你可以使用此方法来判断两个 `Class` 是否存在继承关系。 + +> The following example + +```kotlin +// 假设下面这两个 Class 就是你需要判断的 Class +val classA: Class<*>? +val classB: Class<*>? +// 判断 A 是否继承于 B +if (classA extends classB) { + // Your code here. +} +``` + +## Class?.notExtends - ext-method + +```kotlin:no-line-numbers +infix fun Class<*>?.notExtends(other: Class<*>?): Boolean +``` + +**Change Records** + +`v1.1.5` `added` + +**Function Illustrate** + +> 当前 `Class` 是否不继承于 `other`。 + +此方法相当于 `extends` 的反向判断。 + +**Function Example** + +你可以使用此方法来判断两个 `Class` 是否不存在继承关系。 + +> The following example + +```kotlin +// 假设下面这两个 Class 就是你需要判断的 Class +val classA: Class<*>? +val classB: Class<*>? +// 判断 A 是否不继承于 B +if (classA notExtends classB) { + // Your code here. +} +``` + +## Class?.implements - ext-method + +```kotlin:no-line-numbers +infix fun Class<*>?.implements(other: Class<*>?): Boolean +``` + +**Change Records** + +`v1.1.5` `added` + +**Function Illustrate** + +> 当前 `Class` 是否实现了 `other` 接口类。 + +如果当前 `Class` 为 `null` 或 `other` 为 `null` 会返回 `false`。 + +**Function Example** + +你可以使用此方法来判断两个 `Class` 是否存在依赖关系。 + +> The following example + +```kotlin +// 假设下面这两个 Class 就是你需要判断的 Class +val classA: Class<*>? +val classB: Class<*>? +// 判断 A 是否实现了 B 接口类 +if (classA implements classB) { + // Your code here. +} +``` + +## Class?.notImplements - ext-method + +```kotlin:no-line-numbers +infix fun Class<*>?.notImplements(other: Class<*>?): Boolean +``` + +**Change Records** + +`v1.1.5` `added` + +**Function Illustrate** + +> 当前 `Class` 是否未实现 `other` 接口类。 + +此方法相当于 `implements` 的反向判断。 + +**Function Example** + +你可以使用此方法来判断两个 `Class` 是否不存在依赖关系。 + +> The following example + +```kotlin +// 假设下面这两个 Class 就是你需要判断的 Class +val classA: Class<*>? +val classB: Class<*>? +// 判断 A 是否未实现 B 接口类 +if (classA notImplements classB) { + // Your code here. +} +``` + +## Class.toJavaPrimitiveType - ext-method + +```kotlin:no-line-numbers +fun Class<*>.toJavaPrimitiveType(): Class<*> +``` + +**Change Records** + +`v1.1.5` `added` + +**Function Illustrate** + +> 自动转换当前 `Class` 为 Java 原始类型 (Primitive Type)。 + +如果当前 `Class` 为 Java 或 Kotlin 基本类型将自动执行类型转换。 + +当前能够自动转换的基本类型如下。 + +- `kotlin.Unit` +- `java.lang.Void` +- `java.lang.Boolean` +- `java.lang.Integer` +- `java.lang.Float` +- `java.lang.Double` +- `java.lang.Long` +- `java.lang.Short` +- `java.lang.Character` +- `java.lang.Byte` +

classOf - method

**Change Records** diff --git a/docs-source/src/zh-cn/api/public/com/highcapable/yukihookapi/hook/factory/ReflectionFactory.md b/docs-source/src/zh-cn/api/public/com/highcapable/yukihookapi/hook/factory/ReflectionFactory.md index edd1508b..ed1c239e 100644 --- a/docs-source/src/zh-cn/api/public/com/highcapable/yukihookapi/hook/factory/ReflectionFactory.md +++ b/docs-source/src/zh-cn/api/public/com/highcapable/yukihookapi/hook/factory/ReflectionFactory.md @@ -229,6 +229,165 @@ val Class<*>.hasExtends: Boolean > 当前 `Class` 是否有继承关系,父类是 `Any` 将被认为没有继承关系。 +## Class?.extends - ext-method + +```kotlin:no-line-numbers +infix fun Class<*>?.extends(other: Class<*>?): Boolean +``` + +**变更记录** + +`v1.1.5` `新增` + +**功能描述** + +> 当前 `Class` 是否继承于 `other`。 + +如果当前 `Class` 就是 `other` 也会返回 `true`。 + +如果当前 `Class` 为 `null` 或 `other` 为 `null` 会返回 `false`。 + +**功能示例** + +你可以使用此方法来判断两个 `Class` 是否存在继承关系。 + +> 示例如下 + +```kotlin +// 假设下面这两个 Class 就是你需要判断的 Class +val classA: Class<*>? +val classB: Class<*>? +// 判断 A 是否继承于 B +if (classA extends classB) { + // Your code here. +} +``` + +## Class?.notExtends - ext-method + +```kotlin:no-line-numbers +infix fun Class<*>?.notExtends(other: Class<*>?): Boolean +``` + +**变更记录** + +`v1.1.5` `新增` + +**功能描述** + +> 当前 `Class` 是否不继承于 `other`。 + +此方法相当于 `extends` 的反向判断。 + +**功能示例** + +你可以使用此方法来判断两个 `Class` 是否不存在继承关系。 + +> 示例如下 + +```kotlin +// 假设下面这两个 Class 就是你需要判断的 Class +val classA: Class<*>? +val classB: Class<*>? +// 判断 A 是否不继承于 B +if (classA notExtends classB) { + // Your code here. +} +``` + +## Class?.implements - ext-method + +```kotlin:no-line-numbers +infix fun Class<*>?.implements(other: Class<*>?): Boolean +``` + +**变更记录** + +`v1.1.5` `新增` + +**功能描述** + +> 当前 `Class` 是否实现了 `other` 接口类。 + +如果当前 `Class` 为 `null` 或 `other` 为 `null` 会返回 `false`。 + +**功能示例** + +你可以使用此方法来判断两个 `Class` 是否存在依赖关系。 + +> 示例如下 + +```kotlin +// 假设下面这两个 Class 就是你需要判断的 Class +val classA: Class<*>? +val classB: Class<*>? +// 判断 A 是否实现了 B 接口类 +if (classA implements classB) { + // Your code here. +} +``` + +## Class?.notImplements - ext-method + +```kotlin:no-line-numbers +infix fun Class<*>?.notImplements(other: Class<*>?): Boolean +``` + +**变更记录** + +`v1.1.5` `新增` + +**功能描述** + +> 当前 `Class` 是否未实现 `other` 接口类。 + +此方法相当于 `implements` 的反向判断。 + +**功能示例** + +你可以使用此方法来判断两个 `Class` 是否不存在依赖关系。 + +> 示例如下 + +```kotlin +// 假设下面这两个 Class 就是你需要判断的 Class +val classA: Class<*>? +val classB: Class<*>? +// 判断 A 是否未实现 B 接口类 +if (classA notImplements classB) { + // Your code here. +} +``` + +## Class.toJavaPrimitiveType - ext-method + +```kotlin:no-line-numbers +fun Class<*>.toJavaPrimitiveType(): Class<*> +``` + +**变更记录** + +`v1.1.5` `新增` + +**功能描述** + +> 自动转换当前 `Class` 为 Java 原始类型 (Primitive Type)。 + +如果当前 `Class` 为 Java 或 Kotlin 基本类型将自动执行类型转换。 + +当前能够自动转换的基本类型如下。 + +- `kotlin.Unit` +- `java.lang.Void` +- `java.lang.Boolean` +- `java.lang.Integer` +- `java.lang.Float` +- `java.lang.Double` +- `java.lang.Long` +- `java.lang.Short` +- `java.lang.Character` +- `java.lang.Byte` +

classOf - method

**变更记录** 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 762aa25b..1ded2af8 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 @@ -104,6 +104,93 @@ fun ClassLoader.onLoadClass(result: (Class<*>) -> Unit) = AppParasitics.hookClas */ val Class<*>.hasExtends get() = superclass != null && superclass != AnyClass +/** + * 当前 [Class] 是否继承于 [other] + * + * 如果当前 [Class] 就是 [other] 也会返回 true + * + * 如果当前 [Class] 为 null 或 [other] 为 null 会返回 false + * @param other 需要判断的 [Class] + * @return [Boolean] + */ +infix fun Class<*>?.extends(other: Class<*>?): Boolean { + if (this == null || other == null) return false + var isMatched = false + + /** + * 查找是否存在父类 + * @param current 当前 [Class] + */ + fun findSuperClass(current: Class<*>) { + if (current == other) + isMatched = true + else if (current != AnyClass && current.superclass != null) findSuperClass(current.superclass) + } + findSuperClass(current = this) + return isMatched +} + +/** + * 当前 [Class] 是否不继承于 [other] + * + * 此方法相当于 [extends] 的反向判断 + * @param other 需要判断的 [Class] + * @return [Boolean] + */ +infix fun Class<*>?.notExtends(other: Class<*>?) = extends(other).not() + +/** + * 当前 [Class] 是否实现了 [other] 接口类 + * + * 如果当前 [Class] 为 null 或 [other] 为 null 会返回 false + * @param other 需要判断的 [Class] + * @return [Boolean] + */ +infix fun Class<*>?.implements(other: Class<*>?): Boolean { + if (this == null || other == null) return false + return interfaces.takeIf { it.isNotEmpty() }?.any { it.name == other.name } ?: false +} + +/** + * 当前 [Class] 是否未实现 [other] 接口类 + * + * 此方法相当于 [implements] 的反向判断 + * @param other 需要判断的 [Class] + * @return [Boolean] + */ +infix fun Class<*>?.notImplements(other: Class<*>?) = implements(other).not() + +/** + * 自动转换当前 [Class] 为 Java 原始类型 (Primitive Type) + * + * 如果当前 [Class] 为 Java 或 Kotlin 基本类型将自动执行类型转换 + * + * 当前能够自动转换的基本类型如下 ↓ + * + * - [kotlin.Unit] + * - [java.lang.Void] + * - [java.lang.Boolean] + * - [java.lang.Integer] + * - [java.lang.Float] + * - [java.lang.Double] + * - [java.lang.Long] + * - [java.lang.Short] + * - [java.lang.Character] + * - [java.lang.Byte] + * @return [Class] + */ +fun Class<*>.toJavaPrimitiveType() = + (name.replace(Unit.toString(), "void") + .replace("java.lang.Void", "void") + .replace("java.lang.Boolean", "boolean") + .replace("java.lang.Integer", "int") + .replace("java.lang.Float", "float") + .replace("java.lang.Double", "double") + .replace("java.lang.Long", "long") + .replace("java.lang.Short", "short") + .replace("java.lang.Character", "char") + .replace("java.lang.Byte", "byte")).toClass() + /** * 通过字符串类名转换为 [loader] 中的实体类 *