Modify add "initialize" param in classOf, toClass, toClassOrNull, get, getOrNull function in ReflectionFactory, PackageParam, VariousClass

This commit is contained in:
2023-01-01 22:05:03 +08:00
parent 48ea8c4ebc
commit f31168b5ed
10 changed files with 225 additions and 51 deletions

View File

@@ -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 = ""

View File

@@ -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]")
}

View File

@@ -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 <reified T> String.toClass(loader: ClassLoader? = null) =
ReflectionTool.findClassByName(name = this, loader) as? Class<T> ?: error("Target Class type cannot cast to ${T::class.java}")
inline fun <reified T> String.toClass(loader: ClassLoader? = null, initialize: Boolean = false) =
ReflectionTool.findClassByName(name = this, loader, initialize) as? Class<T>? ?: 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 <reified T> String.toClassOrNull(loader: ClassLoader? = null) = runCatching { toClass<T>(loader) }.getOrNull()
inline fun <reified T> String.toClassOrNull(loader: ClassLoader? = null, initialize: Boolean = false) =
runCatching { toClass<T>(loader, initialize) }.getOrNull()
/**
* 通过 [T] 得到其 [Class] 实例并转换为实体类
* @param loader [Class] 所在的 [ClassLoader] - 默认空 - 可不填
* @param initialize 是否初始化 [Class] 的静态方法块 - 如果未设置 [loader] (为 null) 时将不会生效 - 默认否
* @return [Class]<[T]>
* @throws NoClassDefFoundError 如果找不到 [Class] 或设置了错误的 [ClassLoader]
*/
inline fun <reified T> classOf(loader: ClassLoader? = null) = loader?.let { T::class.java.name.toClass(loader) as Class<T> } ?: T::class.java
inline fun <reified T> classOf(loader: ClassLoader? = null, initialize: Boolean = false) =
loader?.let { T::class.java.name.toClass(loader, initialize) as Class<T> } ?: T::class.java
/**
* 通过字符串类名使用指定的 [ClassLoader] 查找是否存在

View File

@@ -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 <reified T> String.toClass(loader: ClassLoader? = appClassLoader) =
ReflectionTool.findClassByName(name = this, loader) as? Class<T> ?: error("Target Class type cannot cast to ${T::class.java}")
inline fun <reified T> String.toClass(loader: ClassLoader? = appClassLoader, initialize: Boolean = false) =
ReflectionTool.findClassByName(name = this, loader, initialize) as? Class<T>?
?: 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 <reified T> String.toClassOrNull(loader: ClassLoader? = appClassLoader) = runCatching { toClass<T>(loader) }.getOrNull()
inline fun <reified T> String.toClassOrNull(loader: ClassLoader? = appClassLoader, initialize: Boolean = false) =
runCatching { toClass<T>(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)
/**
* 通过字符串类名查找是否存在