mirror of
https://github.com/HighCapable/YukiHookAPI.git
synced 2025-09-04 09:45:19 +08:00
Modify add toClass, toClassOrNull generics method in ReflectionFactory, PackageParam
This commit is contained in:
@@ -253,10 +253,18 @@ val Class<*>.hasExtends: Boolean
|
||||
fun String.toClass(loader: ClassLoader?): Class<*>
|
||||
```
|
||||
|
||||
```kotlin:no-line-numbers
|
||||
inline fun <reified T> String.toClass(loader: ClassLoader?): Class<T>
|
||||
```
|
||||
|
||||
**Change Records**
|
||||
|
||||
`v1.1.0` `added`
|
||||
|
||||
`v1.1.5` `modified`
|
||||
|
||||
新增泛型返回值 `Class<T>` 方法
|
||||
|
||||
**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<DemoClass>()
|
||||
```
|
||||
|
||||
## String.toClassOrNull <span class="symbol">- ext-method</span>
|
||||
|
||||
```kotlin:no-line-numbers
|
||||
fun String.toClassOrNull(loader: ClassLoader?): Class<*>?
|
||||
```
|
||||
|
||||
```kotlin:no-line-numbers
|
||||
inline fun <reified T> String.toClassOrNull(loader: ClassLoader?): Class<T>?
|
||||
```
|
||||
|
||||
**Change Records**
|
||||
|
||||
`v1.1.0` `added`
|
||||
|
||||
`v1.1.5` `modified`
|
||||
|
||||
新增泛型返回值 `Class<T>` 方法
|
||||
|
||||
**Function Illustrate**
|
||||
|
||||
> 通过字符串类名转换为 `loader` 中的实体类。
|
||||
|
@@ -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 <reified T> String.toClass(loader: ClassLoader?): Class<T>
|
||||
```
|
||||
|
||||
```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<T>` 方法
|
||||
|
||||
**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<DemoClass>()
|
||||
```
|
||||
|
||||
你还可以创建一个 `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 <reified T> String.toClassOrNull(loader: ClassLoader?): Class<T>?
|
||||
```
|
||||
|
||||
```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<T>` 方法
|
||||
|
||||
**Function Illustrate**
|
||||
|
||||
> 通过字符串类名、`VariousClass` 转换为 `loader` 中的实体类。
|
||||
|
@@ -245,10 +245,18 @@ val Class<*>.hasExtends: Boolean
|
||||
fun String.toClass(loader: ClassLoader?): Class<*>
|
||||
```
|
||||
|
||||
```kotlin:no-line-numbers
|
||||
inline fun <reified T> String.toClass(loader: ClassLoader?): Class<T>
|
||||
```
|
||||
|
||||
**变更记录**
|
||||
|
||||
`v1.1.0` `新增`
|
||||
|
||||
`v1.1.5` `修改`
|
||||
|
||||
新增泛型返回值 `Class<T>` 方法
|
||||
|
||||
**功能描述**
|
||||
|
||||
> 通过字符串类名转换为 `loader` 中的实体类。
|
||||
@@ -272,16 +280,33 @@ val customClassLoader: ClassLoader? = ... // 假设这个就是你的 ClassLoade
|
||||
"com.example.demo.DemoClass".toClass(customClassLoader)
|
||||
```
|
||||
|
||||
你还可以指定 `Class` 的目标类型。
|
||||
|
||||
> 示例如下
|
||||
|
||||
```kotlin
|
||||
// 指定的 DemoClass 必须存在或为可访问的 stub
|
||||
"com.example.demo.DemoClass".toClass<DemoClass>()
|
||||
```
|
||||
|
||||
## String.toClassOrNull <span class="symbol">- ext-method</span>
|
||||
|
||||
```kotlin:no-line-numbers
|
||||
fun String.toClassOrNull(loader: ClassLoader?): Class<*>?
|
||||
```
|
||||
|
||||
```kotlin:no-line-numbers
|
||||
inline fun <reified T> String.toClassOrNull(loader: ClassLoader?): Class<T>?
|
||||
```
|
||||
|
||||
**变更记录**
|
||||
|
||||
`v1.1.0` `新增`
|
||||
|
||||
`v1.1.5` `修改`
|
||||
|
||||
新增泛型返回值 `Class<T>` 方法
|
||||
|
||||
**功能描述**
|
||||
|
||||
> 通过字符串类名转换为 `loader` 中的实体类。
|
||||
|
@@ -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 <reified T> String.toClass(loader: ClassLoader?): Class<T>
|
||||
```
|
||||
|
||||
```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<T>` 方法
|
||||
|
||||
**功能描述**
|
||||
|
||||
> 通过字符串类名、`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<DemoClass>()
|
||||
```
|
||||
|
||||
你还可以创建一个 `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 <reified T> String.toClassOrNull(loader: ClassLoader?): Class<T>?
|
||||
```
|
||||
|
||||
```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<T>` 方法
|
||||
|
||||
**功能描述**
|
||||
|
||||
> 通过字符串类名、`VariousClass` 转换为 `loader` 中的实体类。
|
||||
|
@@ -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 {
|
||||
|
@@ -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] - 默认空 - 可不填
|
||||
|
@@ -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]
|
||||
|
Reference in New Issue
Block a user