From f31168b5ed0e0a4515939b33b297b8451af534be Mon Sep 17 00:00:00 2001 From: fankesyooni Date: Sun, 1 Jan 2023 22:05:03 +0800 Subject: [PATCH] Modify add "initialize" param in classOf, toClass, toClassOrNull, get, getOrNull function in ReflectionFactory, PackageParam, VariousClass --- .../yukihookapi/hook/bean/VariousClass.md | 12 +++++- .../hook/factory/ReflectionFactory.md | 42 ++++++++++++++++--- .../yukihookapi/hook/param/PackageParam.md | 42 ++++++++++++++++--- .../yukihookapi/hook/bean/VariousClass.md | 12 +++++- .../hook/factory/ReflectionFactory.md | 42 ++++++++++++++++--- .../yukihookapi/hook/param/PackageParam.md | 42 ++++++++++++++++--- .../yukihookapi/hook/bean/VariousClass.kt | 14 +++---- .../hook/core/finder/tools/ReflectionTool.kt | 27 +++++++++--- .../hook/factory/ReflectionFactory.kt | 19 ++++++--- .../yukihookapi/hook/param/PackageParam.kt | 24 +++++++---- 10 files changed, 225 insertions(+), 51 deletions(-) diff --git a/docs-source/src/en/api/public/com/highcapable/yukihookapi/hook/bean/VariousClass.md b/docs-source/src/en/api/public/com/highcapable/yukihookapi/hook/bean/VariousClass.md index 00201ae4..b77ed6fe 100644 --- a/docs-source/src/en/api/public/com/highcapable/yukihookapi/hook/bean/VariousClass.md +++ b/docs-source/src/en/api/public/com/highcapable/yukihookapi/hook/bean/VariousClass.md @@ -31,13 +31,17 @@ class VariousClass(private vararg val name: String) ## get - method ```kotlin:no-line-numbers -fun get(loader: ClassLoader? = null): Class<*> +fun get(loader: ClassLoader? = null, initialize: Boolean): Class<*> ``` **Change Records** `v1.0.70` `added` +`v1.1.5` `modified` + +新增 `initialize` 参数 + **Function Illustrate** > 获取匹配的实体类。 @@ -47,13 +51,17 @@ fun get(loader: ClassLoader? = null): Class<*> ## getOrNull - method ```kotlin:no-line-numbers -fun getOrNull(loader: ClassLoader? = null): Class<*>? +fun getOrNull(loader: ClassLoader? = null, initialize: Boolean): Class<*>? ``` **Change Records** `v1.1.0` `added` +`v1.1.5` `modified` + +新增 `initialize` 参数 + **Function Illustrate** > 获取匹配的实体类。 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 1b1d9971..f595d4d3 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 @@ -409,11 +409,11 @@ fun Class<*>.toJavaPrimitiveType(): Class<*> ## String.toClass - ext-method ```kotlin:no-line-numbers -fun String.toClass(loader: ClassLoader?): Class<*> +fun String.toClass(loader: ClassLoader?, initialize: Boolean): Class<*> ``` ```kotlin:no-line-numbers -inline fun String.toClass(loader: ClassLoader?): Class +inline fun String.toClass(loader: ClassLoader?, initialize: Boolean): Class ``` **Change Records** @@ -424,6 +424,8 @@ inline fun String.toClass(loader: ClassLoader?): Class 新增泛型返回值 `Class` 方法 +新增 `initialize` 参数 + **Function Illustrate** > 通过字符串类名转换为 `loader` 中的实体类。 @@ -456,14 +458,40 @@ val customClassLoader: ClassLoader? = ... // 假设这个就是你的 ClassLoade "com.example.demo.DemoClass".toClass() ``` +你还可以设置在获取到这个 `Class` 时是否自动执行其默认的静态方法块,默认情况下不会执行。 + +> The following example + +```kotlin +// 获取并执行 DemoClass 默认的静态方法块 +"com.example.demo.DemoClass".toClass(initialize = true) +``` + +默认的静态方法块在 Java 中使用如下方式定义。 + +> The following example + +```java:no-line-numbers +public class DemoClass { + + static { + // 这里是静态方法块的内容 + } + + public DemoClass() { + // ... + } +} +``` + ## String.toClassOrNull - ext-method ```kotlin:no-line-numbers -fun String.toClassOrNull(loader: ClassLoader?): Class<*>? +fun String.toClassOrNull(loader: ClassLoader?, initialize: Boolean): Class<*>? ``` ```kotlin:no-line-numbers -inline fun String.toClassOrNull(loader: ClassLoader?): Class? +inline fun String.toClassOrNull(loader: ClassLoader?, initialize: Boolean): Class? ``` **Change Records** @@ -474,6 +502,8 @@ inline fun String.toClassOrNull(loader: ClassLoader?): Class? 新增泛型返回值 `Class` 方法 +新增 `initialize` 参数 + **Function Illustrate** > 通过字符串类名转换为 `loader` 中的实体类。 @@ -487,7 +517,7 @@ inline fun String.toClassOrNull(loader: ClassLoader?): Class? ## classOf - method ```kotlin:no-line-numbers -inline fun classOf(loader: ClassLoader?): Class +inline fun classOf(loader: ClassLoader?, initialize: Boolean): Class ``` **Change Records** @@ -498,6 +528,8 @@ inline fun classOf(loader: ClassLoader?): Class 将返回类型由 `Class<*>` cast 为 `Class` +新增 `initialize` 参数 + **Function Illustrate** > 通过 `T` 得到其 `Class` 实例并转换为实体类。 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 a0839be4..7a2e2bfd 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 @@ -632,15 +632,15 @@ inline fun searchClass(name: String, async: Boolean, initiate: ClassConditions): ## String+VariousClass.toClass - i-ext-method ```kotlin:no-line-numbers -fun String.toClass(loader: ClassLoader?): Class<*> +fun String.toClass(loader: ClassLoader?, initialize: Boolean): Class<*> ``` ```kotlin:no-line-numbers -inline fun String.toClass(loader: ClassLoader?): Class +inline fun String.toClass(loader: ClassLoader?, initialize: Boolean): Class ``` ```kotlin:no-line-numbers -fun VariousClass.toClass(loader: ClassLoader?): Class<*> +fun VariousClass.toClass(loader: ClassLoader?, initialize: Boolean): Class<*> ``` **Change Records** @@ -651,6 +651,8 @@ fun VariousClass.toClass(loader: ClassLoader?): Class<*> 新增泛型返回值 `Class` 方法 +新增 `initialize` 参数 + **Function Illustrate** > 通过字符串类名、`VariousClass` 转换为 `loader` 中的实体类。 @@ -685,6 +687,32 @@ val customClassLoader: ClassLoader? = ... // 假设这个就是你的 ClassLoade "com.example.demo.DemoClass".toClass() ``` +你还可以设置在获取到这个 `Class` 时是否自动执行其默认的静态方法块,默认情况下不会执行。 + +> The following example + +```kotlin +// 获取并执行 DemoClass 默认的静态方法块 +"com.example.demo.DemoClass".toClass(initialize = true) +``` + +默认的静态方法块在 Java 中使用如下方式定义。 + +> The following example + +```java:no-line-numbers +public class DemoClass { + + static { + // 这里是静态方法块的内容 + } + + public DemoClass() { + // ... + } +} +``` + 你还可以创建一个 `VariousClass`,并转换为实体类。 `VariousClass` 会枚举所有设置的 `Class` 并最终获得第一个存在的 `Class`。 @@ -707,15 +735,15 @@ VariousClass("com.example.demo.DemoClass1", "com.example.demo.DemoClass2").toCla ## String+VariousClass.toClassOrNull - i-ext-method ```kotlin:no-line-numbers -fun String.toClassOrNull(loader: ClassLoader?): Class<*>? +fun String.toClassOrNull(loader: ClassLoader?, initialize: Boolean): Class<*>? ``` ```kotlin:no-line-numbers -inline fun String.toClassOrNull(loader: ClassLoader?): Class? +inline fun String.toClassOrNull(loader: ClassLoader?, initialize: Boolean): Class? ``` ```kotlin:no-line-numbers -fun VariousClass.toClassOrNull(loader: ClassLoader?): Class<*>? +fun VariousClass.toClassOrNull(loader: ClassLoader?, initialize: Boolean): Class<*>? ``` **Change Records** @@ -726,6 +754,8 @@ fun VariousClass.toClassOrNull(loader: ClassLoader?): Class<*>? 新增泛型返回值 `Class` 方法 +新增 `initialize` 参数 + **Function Illustrate** > 通过字符串类名、`VariousClass` 转换为 `loader` 中的实体类。 diff --git a/docs-source/src/zh-cn/api/public/com/highcapable/yukihookapi/hook/bean/VariousClass.md b/docs-source/src/zh-cn/api/public/com/highcapable/yukihookapi/hook/bean/VariousClass.md index f4aa1c9b..5d176cce 100644 --- a/docs-source/src/zh-cn/api/public/com/highcapable/yukihookapi/hook/bean/VariousClass.md +++ b/docs-source/src/zh-cn/api/public/com/highcapable/yukihookapi/hook/bean/VariousClass.md @@ -23,13 +23,17 @@ class VariousClass(private vararg val name: String) ## get - method ```kotlin:no-line-numbers -fun get(loader: ClassLoader? = null): Class<*> +fun get(loader: ClassLoader? = null, initialize: Boolean): Class<*> ``` **变更记录** `v1.0.70` `新增` +`v1.1.5` `修改` + +新增 `initialize` 参数 + **功能描述** > 获取匹配的实体类。 @@ -39,13 +43,17 @@ fun get(loader: ClassLoader? = null): Class<*> ## getOrNull - method ```kotlin:no-line-numbers -fun getOrNull(loader: ClassLoader? = null): Class<*>? +fun getOrNull(loader: ClassLoader? = null, initialize: Boolean): Class<*>? ``` **变更记录** `v1.1.0` `新增` +`v1.1.5` `修改` + +新增 `initialize` 参数 + **功能描述** > 获取匹配的实体类。 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 b07c6eba..428e6106 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 @@ -401,11 +401,11 @@ fun Class<*>.toJavaPrimitiveType(): Class<*> ## String.toClass - ext-method ```kotlin:no-line-numbers -fun String.toClass(loader: ClassLoader?): Class<*> +fun String.toClass(loader: ClassLoader?, initialize: Boolean): Class<*> ``` ```kotlin:no-line-numbers -inline fun String.toClass(loader: ClassLoader?): Class +inline fun String.toClass(loader: ClassLoader?, initialize: Boolean): Class ``` **变更记录** @@ -416,6 +416,8 @@ inline fun String.toClass(loader: ClassLoader?): Class 新增泛型返回值 `Class` 方法 +新增 `initialize` 参数 + **功能描述** > 通过字符串类名转换为 `loader` 中的实体类。 @@ -448,14 +450,40 @@ val customClassLoader: ClassLoader? = ... // 假设这个就是你的 ClassLoade "com.example.demo.DemoClass".toClass() ``` +你还可以设置在获取到这个 `Class` 时是否自动执行其默认的静态方法块,默认情况下不会执行。 + +> 示例如下 + +```kotlin +// 获取并执行 DemoClass 默认的静态方法块 +"com.example.demo.DemoClass".toClass(initialize = true) +``` + +默认的静态方法块在 Java 中使用如下方式定义。 + +> 示例如下 + +```java:no-line-numbers +public class DemoClass { + + static { + // 这里是静态方法块的内容 + } + + public DemoClass() { + // ... + } +} +``` + ## String.toClassOrNull - ext-method ```kotlin:no-line-numbers -fun String.toClassOrNull(loader: ClassLoader?): Class<*>? +fun String.toClassOrNull(loader: ClassLoader?, initialize: Boolean): Class<*>? ``` ```kotlin:no-line-numbers -inline fun String.toClassOrNull(loader: ClassLoader?): Class? +inline fun String.toClassOrNull(loader: ClassLoader?, initialize: Boolean): Class? ``` **变更记录** @@ -466,6 +494,8 @@ inline fun String.toClassOrNull(loader: ClassLoader?): Class? 新增泛型返回值 `Class` 方法 +新增 `initialize` 参数 + **功能描述** > 通过字符串类名转换为 `loader` 中的实体类。 @@ -479,7 +509,7 @@ inline fun String.toClassOrNull(loader: ClassLoader?): Class? ## classOf - method ```kotlin:no-line-numbers -inline fun classOf(loader: ClassLoader?): Class +inline fun classOf(loader: ClassLoader?, initialize: Boolean): Class ``` **变更记录** @@ -490,6 +520,8 @@ inline fun classOf(loader: ClassLoader?): Class 将返回类型由 `Class<*>` cast 为 `Class` +新增 `initialize` 参数 + **功能描述** > 通过 `T` 得到其 `Class` 实例并转换为实体类。 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 37f32510..4037bdc4 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 @@ -624,15 +624,15 @@ inline fun searchClass(name: String, async: Boolean, initiate: ClassConditions): ## String+VariousClass.toClass - i-ext-method ```kotlin:no-line-numbers -fun String.toClass(loader: ClassLoader?): Class<*> +fun String.toClass(loader: ClassLoader?, initialize: Boolean): Class<*> ``` ```kotlin:no-line-numbers -inline fun String.toClass(loader: ClassLoader?): Class +inline fun String.toClass(loader: ClassLoader?, initialize: Boolean): Class ``` ```kotlin:no-line-numbers -fun VariousClass.toClass(loader: ClassLoader?): Class<*> +fun VariousClass.toClass(loader: ClassLoader?, initialize: Boolean): Class<*> ``` **变更记录** @@ -643,6 +643,8 @@ fun VariousClass.toClass(loader: ClassLoader?): Class<*> 新增泛型返回值 `Class` 方法 +新增 `initialize` 参数 + **功能描述** > 通过字符串类名、`VariousClass` 转换为 `loader` 中的实体类。 @@ -677,6 +679,32 @@ val customClassLoader: ClassLoader? = ... // 假设这个就是你的 ClassLoade "com.example.demo.DemoClass".toClass() ``` +你还可以设置在获取到这个 `Class` 时是否自动执行其默认的静态方法块,默认情况下不会执行。 + +> 示例如下 + +```kotlin +// 获取并执行 DemoClass 默认的静态方法块 +"com.example.demo.DemoClass".toClass(initialize = true) +``` + +默认的静态方法块在 Java 中使用如下方式定义。 + +> 示例如下 + +```java:no-line-numbers +public class DemoClass { + + static { + // 这里是静态方法块的内容 + } + + public DemoClass() { + // ... + } +} +``` + 你还可以创建一个 `VariousClass`,并转换为实体类。 `VariousClass` 会枚举所有设置的 `Class` 并最终获得第一个存在的 `Class`。 @@ -699,15 +727,15 @@ VariousClass("com.example.demo.DemoClass1", "com.example.demo.DemoClass2").toCla ## String+VariousClass.toClassOrNull - i-ext-method ```kotlin:no-line-numbers -fun String.toClassOrNull(loader: ClassLoader?): Class<*>? +fun String.toClassOrNull(loader: ClassLoader?, initialize: Boolean): Class<*>? ``` ```kotlin:no-line-numbers -inline fun String.toClassOrNull(loader: ClassLoader?): Class? +inline fun String.toClassOrNull(loader: ClassLoader?, initialize: Boolean): Class? ``` ```kotlin:no-line-numbers -fun VariousClass.toClassOrNull(loader: ClassLoader?): Class<*>? +fun VariousClass.toClassOrNull(loader: ClassLoader?, initialize: Boolean): Class<*>? ``` **变更记录** @@ -718,6 +746,8 @@ fun VariousClass.toClassOrNull(loader: ClassLoader?): Class<*>? 新增泛型返回值 `Class` 方法 +新增 `initialize` 参数 + **功能描述** > 通过字符串类名、`VariousClass` 转换为 `loader` 中的实体类。 diff --git a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/bean/VariousClass.kt b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/bean/VariousClass.kt index a0948368..2d5636bc 100644 --- a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/bean/VariousClass.kt +++ b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/bean/VariousClass.kt @@ -27,7 +27,7 @@ */ package com.highcapable.yukihookapi.hook.bean -import com.highcapable.yukihookapi.hook.factory.toClass +import com.highcapable.yukihookapi.hook.factory.toClassOrNull /** * 这是一个不确定性 [Class] 类名装载器 @@ -40,17 +40,16 @@ class VariousClass(private vararg val name: String) { * * - 使用当前 [loader] 装载目标 [Class] * @param loader 当前 [ClassLoader] - 若留空使用默认 [ClassLoader] + * @param initialize 是否初始化 [Class] 的静态方法块 - 默认否 * @return [Class] * @throws IllegalStateException 如果任何 [Class] 都没有匹配到 */ - fun get(loader: ClassLoader? = null): Class<*> { + fun get(loader: ClassLoader? = null, initialize: Boolean = false): Class<*> { var finalClass: Class<*>? = null if (name.isNotEmpty()) run { name.forEach { - runCatching { - finalClass = it.toClass(loader) - return@run - } + finalClass = it.toClassOrNull(loader, initialize) + if (finalClass != null) return@run } } return finalClass ?: error("VariousClass match failed of those $this") @@ -63,9 +62,10 @@ class VariousClass(private vararg val name: String) { * * 匹配不到 [Class] 会返回 null - 不会抛出异常 * @param loader 当前 [ClassLoader] - 若留空使用默认 [ClassLoader] + * @param initialize 是否初始化 [Class] 的静态方法块 - 默认否 * @return [Class] or null */ - fun getOrNull(loader: ClassLoader? = null) = runCatching { get(loader) }.getOrNull() + fun getOrNull(loader: ClassLoader? = null, initialize: Boolean = false) = runCatching { get(loader, initialize) }.getOrNull() override fun toString(): String { var result = "" 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 0a36e409..c414077d 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 @@ -95,18 +95,35 @@ internal object ReflectionTool { * 使用字符串类名获取 [Class] * @param name [Class] 完整名称 * @param loader [Class] 所在的 [ClassLoader] + * @param initialize 是否初始化 [Class] 的静态方法块 - 默认否 * @return [Class] * @throws NoClassDefFoundError 如果找不到 [Class] 或设置了错误的 [ClassLoader] */ @PublishedApi - internal fun findClassByName(name: String, loader: ClassLoader?): Class<*> { + internal fun findClassByName(name: String, loader: ClassLoader?, initialize: Boolean = false): Class<*> { val hashCode = ("[$name][$loader]").hashCode() + + /** + * 获取 [Class.forName] 的 [Class] 对象 + * @param name [Class] 完整名称 + * @param initialize 是否初始化 [Class] 的静态方法块 + * @param loader [Class] 所在的 [ClassLoader] - 默认为 [AppParasitics.baseClassLoader] + * @return [Class] + */ + fun classForName(name: String, initialize: Boolean, loader: ClassLoader? = AppParasitics.baseClassLoader) = + Class.forName(name, initialize, loader) + + /** + * 使用默认方式和 [ClassLoader] 装载 [Class] + * @return [Class] or null + */ + fun loadWithDefaultClassLoader() = if (initialize.not()) loader?.loadClass(name) else classForName(name, initialize, loader) return ReflectsCacheStore.findClass(hashCode) ?: runCatching { when { - YukiHookBridge.hasXposedBridge -> runCatching { YukiHookHelper.findClass(name, loader) } - .getOrNull() ?: (if (loader == null) Class.forName(name) else loader.loadClass(name)) - loader == null -> Class.forName(name) - else -> loader.loadClass(name) + YukiHookBridge.hasXposedBridge -> runCatching { if (initialize.not()) YukiHookHelper.findClass(name, loader) else null } + .getOrNull() ?: loadWithDefaultClassLoader() ?: classForName(name, initialize) + loader == null -> classForName(name, initialize) + else -> loadWithDefaultClassLoader() }.also { ReflectsCacheStore.putClass(hashCode, it) } }.getOrNull() ?: throw createException(loader ?: AppParasitics.baseClassLoader, name = "Class", "name:[$name]") } 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 6576367d..0e57d9bb 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 @@ -207,48 +207,55 @@ fun classOf(name: String, loader: ClassLoader? = null) = name.toClass(loader) /** * 通过字符串类名转换为 [loader] 中的实体类 * @param loader [Class] 所在的 [ClassLoader] - 默认空 - 不填使用默认 [ClassLoader] + * @param initialize 是否初始化 [Class] 的静态方法块 - 默认否 * @return [Class] * @throws NoClassDefFoundError 如果找不到 [Class] 或设置了错误的 [ClassLoader] */ -fun String.toClass(loader: ClassLoader? = null) = ReflectionTool.findClassByName(name = this, loader) +fun String.toClass(loader: ClassLoader? = null, initialize: Boolean = false) = ReflectionTool.findClassByName(name = this, loader, initialize) /** * 通过字符串类名转换为 [loader] 中的实体类 * @param loader [Class] 所在的 [ClassLoader] - 默认空 - 不填使用默认 [ClassLoader] + * @param initialize 是否初始化 [Class] 的静态方法块 - 默认否 * @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}") +inline fun String.toClass(loader: ClassLoader? = null, initialize: Boolean = false) = + ReflectionTool.findClassByName(name = this, loader, initialize) as? Class? ?: error("Target Class type cannot cast to ${T::class.java}") /** * 通过字符串类名转换为 [loader] 中的实体类 * * 找不到 [Class] 会返回 null - 不会抛出异常 * @param loader [Class] 所在的 [ClassLoader] - 默认空 - 不填使用默认 [ClassLoader] + * @param initialize 是否初始化 [Class] 的静态方法块 - 默认否 * @return [Class] or null */ -fun String.toClassOrNull(loader: ClassLoader? = null) = runCatching { toClass(loader) }.getOrNull() +fun String.toClassOrNull(loader: ClassLoader? = null, initialize: Boolean = false) = runCatching { toClass(loader, initialize) }.getOrNull() /** * 通过字符串类名转换为 [loader] 中的实体类 * * 找不到 [Class] 会返回 null - 不会抛出异常 * @param loader [Class] 所在的 [ClassLoader] - 默认空 - 不填使用默认 [ClassLoader] + * @param initialize 是否初始化 [Class] 的静态方法块 - 默认否 * @return [Class]<[T]> or null */ @JvmName("toClassOrNull_Generics") -inline fun String.toClassOrNull(loader: ClassLoader? = null) = runCatching { toClass(loader) }.getOrNull() +inline fun String.toClassOrNull(loader: ClassLoader? = null, initialize: Boolean = false) = + runCatching { toClass(loader, initialize) }.getOrNull() /** * 通过 [T] 得到其 [Class] 实例并转换为实体类 * @param loader [Class] 所在的 [ClassLoader] - 默认空 - 可不填 + * @param initialize 是否初始化 [Class] 的静态方法块 - 如果未设置 [loader] (为 null) 时将不会生效 - 默认否 * @return [Class]<[T]> * @throws NoClassDefFoundError 如果找不到 [Class] 或设置了错误的 [ClassLoader] */ -inline fun classOf(loader: ClassLoader? = null) = loader?.let { T::class.java.name.toClass(loader) as Class } ?: T::class.java +inline fun classOf(loader: ClassLoader? = null, initialize: Boolean = false) = + loader?.let { T::class.java.name.toClass(loader, initialize) as Class } ?: T::class.java /** * 通过字符串类名使用指定的 [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 47944e61..5ba6070b 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 @@ -476,57 +476,67 @@ open class PackageParam internal constructor(@PublishedApi internal var wrapper: /** * 通过字符串类名转换为 [loader] 中的实体类 * @param loader [Class] 所在的 [ClassLoader] - 不填使用 [appClassLoader] + * @param initialize 是否初始化 [Class] 的静态方法块 - 默认否 * @return [Class] * @throws NoClassDefFoundError 如果找不到 [Class] */ - fun String.toClass(loader: ClassLoader? = appClassLoader) = ReflectionTool.findClassByName(name = this, loader) + fun String.toClass(loader: ClassLoader? = appClassLoader, initialize: Boolean = false) = + ReflectionTool.findClassByName(name = this, loader, initialize) /** * 通过字符串类名转换为 [loader] 中的实体类 * @param loader [Class] 所在的 [ClassLoader] - 不填使用 [appClassLoader] + * @param initialize 是否初始化 [Class] 的静态方法块 - 默认否 * @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}") + inline fun String.toClass(loader: ClassLoader? = appClassLoader, initialize: Boolean = false) = + ReflectionTool.findClassByName(name = this, loader, initialize) as? Class? + ?: error("Target Class type cannot cast to ${T::class.java}") /** * 通过字符串类名转换为 [loader] 中的实体类 * * 找不到 [Class] 会返回 null - 不会抛出异常 * @param loader [Class] 所在的 [ClassLoader] - 不填使用 [appClassLoader] + * @param initialize 是否初始化 [Class] 的静态方法块 - 默认否 * @return [Class] or null */ - fun String.toClassOrNull(loader: ClassLoader? = appClassLoader) = runCatching { toClass(loader) }.getOrNull() + fun String.toClassOrNull(loader: ClassLoader? = appClassLoader, initialize: Boolean = false) = + runCatching { toClass(loader, initialize) }.getOrNull() /** * 通过字符串类名转换为 [loader] 中的实体类 * * 找不到 [Class] 会返回 null - 不会抛出异常 * @param loader [Class] 所在的 [ClassLoader] - 不填使用 [appClassLoader] + * @param initialize 是否初始化 [Class] 的静态方法块 - 默认否 * @return [Class]<[T]> or null */ @JvmName("toClassOrNull_Generics") - inline fun String.toClassOrNull(loader: ClassLoader? = appClassLoader) = runCatching { toClass(loader) }.getOrNull() + inline fun String.toClassOrNull(loader: ClassLoader? = appClassLoader, initialize: Boolean = false) = + runCatching { toClass(loader, initialize) }.getOrNull() /** * [VariousClass] 转换为 [loader] 中的实体类 * @param loader [Class] 所在的 [ClassLoader] - 不填使用 [appClassLoader] + * @param initialize 是否初始化 [Class] 的静态方法块 - 默认否 * @return [Class] * @throws IllegalStateException 如果任何 [Class] 都没有匹配到 */ - fun VariousClass.toClass(loader: ClassLoader? = appClassLoader) = get(loader) + fun VariousClass.toClass(loader: ClassLoader? = appClassLoader, initialize: Boolean = false) = get(loader, initialize) /** * [VariousClass] 转换为 [loader] 中的实体类 * * 匹配不到 [Class] 会返回 null - 不会抛出异常 * @param loader [Class] 所在的 [ClassLoader] - 不填使用 [appClassLoader] + * @param initialize 是否初始化 [Class] 的静态方法块 - 默认否 * @return [Class] or null */ - fun VariousClass.toClassOrNull(loader: ClassLoader? = appClassLoader) = getOrNull(loader) + fun VariousClass.toClassOrNull(loader: ClassLoader? = appClassLoader, initialize: Boolean = false) = getOrNull(loader, initialize) /** * 通过字符串类名查找是否存在