Modify add toClass, toClassOrNull generics method in ReflectionFactory, PackageParam

This commit is contained in:
2022-12-29 20:38:42 +08:00
parent 79b9c98a04
commit eb5abb3403
7 changed files with 145 additions and 1 deletions

View File

@@ -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 {

View File

@@ -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 <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}")
/**
* 通过字符串类名转换为 [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 <reified T> String.toClassOrNull(loader: ClassLoader? = null) = runCatching { toClass<T>(loader) }.getOrNull()
/**
* 通过 [T] 得到其 [Class] 实例并转换为实体类
* @param loader [Class] 所在的 [ClassLoader] - 默认空 - 可不填

View File

@@ -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 <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}")
/**
* 通过字符串类名转换为 [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 <reified T> String.toClassOrNull(loader: ClassLoader? = appClassLoader) = runCatching { toClass<T>(loader) }.getOrNull()
/**
* [VariousClass] 转换为 [loader] 中的实体类
* @param loader [Class] 所在的 [ClassLoader] - 不填使用 [appClassLoader]