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 3d66d909..451115d2 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 @@ -253,10 +253,18 @@ val Class<*>.hasExtends: Boolean fun String.toClass(loader: ClassLoader?): Class<*> ``` +```kotlin:no-line-numbers +inline fun String.toClass(loader: ClassLoader?): Class +``` + **Change Records** `v1.1.0` `added` +`v1.1.5` `modified` + +新增泛型返回值 `Class` 方法 + **Function Illustrate** > 通过字符串类名转换为 `loader` 中的实体类。 @@ -280,16 +288,33 @@ val customClassLoader: ClassLoader? = ... // 假设这个就是你的 ClassLoade "com.example.demo.DemoClass".toClass(customClassLoader) ``` +你还可以指定 `Class` 的目标类型。 + +> The following example + +```kotlin +// 指定的 DemoClass 必须存在或为可访问的 stub +"com.example.demo.DemoClass".toClass() +``` + ## String.toClassOrNull - ext-method ```kotlin:no-line-numbers fun String.toClassOrNull(loader: ClassLoader?): Class<*>? ``` +```kotlin:no-line-numbers +inline fun String.toClassOrNull(loader: ClassLoader?): Class? +``` + **Change Records** `v1.1.0` `added` +`v1.1.5` `modified` + +新增泛型返回值 `Class` 方法 + **Function Illustrate** > 通过字符串类名转换为 `loader` 中的实体类。 diff --git a/docs-source/src/en/api/public/com/highcapable/yukihookapi/hook/param/PackageParam.md b/docs-source/src/en/api/public/com/highcapable/yukihookapi/hook/param/PackageParam.md index 157b500b..a0839be4 100644 --- a/docs-source/src/en/api/public/com/highcapable/yukihookapi/hook/param/PackageParam.md +++ b/docs-source/src/en/api/public/com/highcapable/yukihookapi/hook/param/PackageParam.md @@ -635,6 +635,10 @@ inline fun searchClass(name: String, async: Boolean, initiate: ClassConditions): fun String.toClass(loader: ClassLoader?): Class<*> ``` +```kotlin:no-line-numbers +inline fun String.toClass(loader: ClassLoader?): Class +``` + ```kotlin:no-line-numbers fun VariousClass.toClass(loader: ClassLoader?): Class<*> ``` @@ -643,6 +647,10 @@ fun VariousClass.toClass(loader: ClassLoader?): Class<*> `v1.1.0` `added` +`v1.1.5` `modified` + +新增泛型返回值 `Class` 方法 + **Function Illustrate** > 通过字符串类名、`VariousClass` 转换为 `loader` 中的实体类。 @@ -668,6 +676,15 @@ val customClassLoader: ClassLoader? = ... // 假设这个就是你的 ClassLoade "com.example.demo.DemoClass".toClass(customClassLoader) ``` +你还可以指定 `Class` 的目标类型。 + +> The following example + +```kotlin +// 指定的 DemoClass 必须存在或为可访问的 stub +"com.example.demo.DemoClass".toClass() +``` + 你还可以创建一个 `VariousClass`,并转换为实体类。 `VariousClass` 会枚举所有设置的 `Class` 并最终获得第一个存在的 `Class`。 @@ -693,6 +710,10 @@ VariousClass("com.example.demo.DemoClass1", "com.example.demo.DemoClass2").toCla fun String.toClassOrNull(loader: ClassLoader?): Class<*>? ``` +```kotlin:no-line-numbers +inline fun String.toClassOrNull(loader: ClassLoader?): Class? +``` + ```kotlin:no-line-numbers fun VariousClass.toClassOrNull(loader: ClassLoader?): Class<*>? ``` @@ -701,6 +722,10 @@ fun VariousClass.toClassOrNull(loader: ClassLoader?): Class<*>? `v1.1.0` `added` +`v1.1.5` `modified` + +新增泛型返回值 `Class` 方法 + **Function Illustrate** > 通过字符串类名、`VariousClass` 转换为 `loader` 中的实体类。 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 74a9363f..edd1508b 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 @@ -245,10 +245,18 @@ val Class<*>.hasExtends: Boolean fun String.toClass(loader: ClassLoader?): Class<*> ``` +```kotlin:no-line-numbers +inline fun String.toClass(loader: ClassLoader?): Class +``` + **变更记录** `v1.1.0` `新增` +`v1.1.5` `修改` + +新增泛型返回值 `Class` 方法 + **功能描述** > 通过字符串类名转换为 `loader` 中的实体类。 @@ -272,16 +280,33 @@ val customClassLoader: ClassLoader? = ... // 假设这个就是你的 ClassLoade "com.example.demo.DemoClass".toClass(customClassLoader) ``` +你还可以指定 `Class` 的目标类型。 + +> 示例如下 + +```kotlin +// 指定的 DemoClass 必须存在或为可访问的 stub +"com.example.demo.DemoClass".toClass() +``` + ## String.toClassOrNull - ext-method ```kotlin:no-line-numbers fun String.toClassOrNull(loader: ClassLoader?): Class<*>? ``` +```kotlin:no-line-numbers +inline fun String.toClassOrNull(loader: ClassLoader?): Class? +``` + **变更记录** `v1.1.0` `新增` +`v1.1.5` `修改` + +新增泛型返回值 `Class` 方法 + **功能描述** > 通过字符串类名转换为 `loader` 中的实体类。 diff --git a/docs-source/src/zh-cn/api/public/com/highcapable/yukihookapi/hook/param/PackageParam.md b/docs-source/src/zh-cn/api/public/com/highcapable/yukihookapi/hook/param/PackageParam.md index 7b26afac..37f32510 100644 --- a/docs-source/src/zh-cn/api/public/com/highcapable/yukihookapi/hook/param/PackageParam.md +++ b/docs-source/src/zh-cn/api/public/com/highcapable/yukihookapi/hook/param/PackageParam.md @@ -627,6 +627,10 @@ inline fun searchClass(name: String, async: Boolean, initiate: ClassConditions): fun String.toClass(loader: ClassLoader?): Class<*> ``` +```kotlin:no-line-numbers +inline fun String.toClass(loader: ClassLoader?): Class +``` + ```kotlin:no-line-numbers fun VariousClass.toClass(loader: ClassLoader?): Class<*> ``` @@ -635,6 +639,10 @@ fun VariousClass.toClass(loader: ClassLoader?): Class<*> `v1.1.0` `新增` +`v1.1.5` `修改` + +新增泛型返回值 `Class` 方法 + **功能描述** > 通过字符串类名、`VariousClass` 转换为 `loader` 中的实体类。 @@ -660,6 +668,15 @@ val customClassLoader: ClassLoader? = ... // 假设这个就是你的 ClassLoade "com.example.demo.DemoClass".toClass(customClassLoader) ``` +你还可以指定 `Class` 的目标类型。 + +> 示例如下 + +```kotlin +// 指定的 DemoClass 必须存在或为可访问的 stub +"com.example.demo.DemoClass".toClass() +``` + 你还可以创建一个 `VariousClass`,并转换为实体类。 `VariousClass` 会枚举所有设置的 `Class` 并最终获得第一个存在的 `Class`。 @@ -685,6 +702,10 @@ VariousClass("com.example.demo.DemoClass1", "com.example.demo.DemoClass2").toCla fun String.toClassOrNull(loader: ClassLoader?): Class<*>? ``` +```kotlin:no-line-numbers +inline fun String.toClassOrNull(loader: ClassLoader?): Class? +``` + ```kotlin:no-line-numbers fun VariousClass.toClassOrNull(loader: ClassLoader?): Class<*>? ``` @@ -693,6 +714,10 @@ fun VariousClass.toClassOrNull(loader: ClassLoader?): Class<*>? `v1.1.0` `新增` +`v1.1.5` `修改` + +新增泛型返回值 `Class` 方法 + **功能描述** > 通过字符串类名、`VariousClass` 转换为 `loader` 中的实体类。 diff --git a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/core/finder/tools/ReflectionTool.kt b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/core/finder/tools/ReflectionTool.kt index 79115c6e..82ea7506 100644 --- a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/core/finder/tools/ReflectionTool.kt +++ b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/core/finder/tools/ReflectionTool.kt @@ -63,6 +63,7 @@ import kotlin.math.abs /** * 这是一个对 [Class]、[Member] 查找的工具实现类 */ +@PublishedApi internal object ReflectionTool { /** 当前工具类的标签 */ @@ -100,6 +101,7 @@ internal object ReflectionTool { * @return [Class] * @throws NoClassDefFoundError 如果找不到 [Class] 或设置了错误的 [ClassLoader] */ + @PublishedApi internal fun findClassByName(name: String, loader: ClassLoader?): Class<*> { val hashCode = ("[$name][$loader]").hashCode() return ReflectsCacheStore.findClass(hashCode) ?: runCatching { 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 58c81076..01a9eeed 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 @@ -123,6 +123,17 @@ fun classOf(name: String, loader: ClassLoader? = null) = name.toClass(loader) */ fun String.toClass(loader: ClassLoader? = null) = ReflectionTool.findClassByName(name = this, loader) +/** + * 通过字符串类名转换为 [loader] 中的实体类 + * @param loader [Class] 所在的 [ClassLoader] - 默认空 - 不填使用默认 [ClassLoader] + * @return [Class]<[T]> + * @throws NoClassDefFoundError 如果找不到 [Class] 或设置了错误的 [ClassLoader] + * @throws IllegalStateException 如果 [Class] 的类型不为 [T] + */ +@JvmName("toClass_Generics") +inline fun String.toClass(loader: ClassLoader? = null) = + ReflectionTool.findClassByName(name = this, loader) as? Class ?: error("Target Class type cannot cast to ${T::class.java}") + /** * 通过字符串类名转换为 [loader] 中的实体类 * @@ -132,6 +143,16 @@ fun String.toClass(loader: ClassLoader? = null) = ReflectionTool.findClassByName */ fun String.toClassOrNull(loader: ClassLoader? = null) = runCatching { toClass(loader) }.getOrNull() +/** + * 通过字符串类名转换为 [loader] 中的实体类 + * + * 找不到 [Class] 会返回 null - 不会抛出异常 + * @param loader [Class] 所在的 [ClassLoader] - 默认空 - 不填使用默认 [ClassLoader] + * @return [Class]<[T]> or null + */ +@JvmName("toClassOrNull_Generics") +inline fun String.toClassOrNull(loader: ClassLoader? = null) = runCatching { toClass(loader) }.getOrNull() + /** * 通过 [T] 得到其 [Class] 实例并转换为实体类 * @param loader [Class] 所在的 [ClassLoader] - 默认空 - 可不填 diff --git a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/param/PackageParam.kt b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/param/PackageParam.kt index 5b0cadbd..47944e61 100644 --- a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/param/PackageParam.kt +++ b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/param/PackageParam.kt @@ -25,7 +25,7 @@ * * This file is Created by fankes on 2022/2/2. */ -@file:Suppress("unused", "MemberVisibilityCanBePrivate") +@file:Suppress("unused", "MemberVisibilityCanBePrivate", "UNCHECKED_CAST") package com.highcapable.yukihookapi.hook.param @@ -481,6 +481,17 @@ open class PackageParam internal constructor(@PublishedApi internal var wrapper: */ fun String.toClass(loader: ClassLoader? = appClassLoader) = ReflectionTool.findClassByName(name = this, loader) + /** + * 通过字符串类名转换为 [loader] 中的实体类 + * @param loader [Class] 所在的 [ClassLoader] - 不填使用 [appClassLoader] + * @return [Class]<[T]> + * @throws NoClassDefFoundError 如果找不到 [Class] + * @throws IllegalStateException 如果 [Class] 的类型不为 [T] + */ + @JvmName("toClass_Generics") + inline fun String.toClass(loader: ClassLoader? = appClassLoader) = + ReflectionTool.findClassByName(name = this, loader) as? Class ?: error("Target Class type cannot cast to ${T::class.java}") + /** * 通过字符串类名转换为 [loader] 中的实体类 * @@ -490,6 +501,16 @@ open class PackageParam internal constructor(@PublishedApi internal var wrapper: */ fun String.toClassOrNull(loader: ClassLoader? = appClassLoader) = runCatching { toClass(loader) }.getOrNull() + /** + * 通过字符串类名转换为 [loader] 中的实体类 + * + * 找不到 [Class] 会返回 null - 不会抛出异常 + * @param loader [Class] 所在的 [ClassLoader] - 不填使用 [appClassLoader] + * @return [Class]<[T]> or null + */ + @JvmName("toClassOrNull_Generics") + inline fun String.toClassOrNull(loader: ClassLoader? = appClassLoader) = runCatching { toClass(loader) }.getOrNull() + /** * [VariousClass] 转换为 [loader] 中的实体类 * @param loader [Class] 所在的 [ClassLoader] - 不填使用 [appClassLoader]