Modify move ClassLoader.fetching in PackageParam to ClassLoader.onLoadClass in ReflectionFactory and fix reuse problem

This commit is contained in:
2022-09-13 23:45:15 +08:00
parent 9f68066d5e
commit d345a5d94b
6 changed files with 93 additions and 78 deletions

View File

@@ -619,69 +619,6 @@ val outsideLoader: ClassLoader? = ... // 假设这就是你的 ClassLoader
findClass("com.example.demo.OutsideClass1", "com.example.demo.OutsideClass2", "com.example.demo.OutsideClass3", loader = outsideLoader)
```
### ClassLoader.fetching *- i-ext-method*
```kotlin
fun ClassLoader.fetching(result: (clazz: Class<*>, resolve: Boolean) -> Unit)
```
**变更记录**
`v1.0.93` `新增`
**功能描述**
> 监听并 Hook 当前 `ClassLoader` 的 `ClassLoader.loadClass` 方法。
!> 请注意只有当前 `ClassLoader` 有主动使用 `ClassLoader.loadClass` 事件时才能被捕获。
!> 这是一个实验性功能,一般情况下不会用到此方法,不保证不会发生错误。
**功能示例**
针对一些使用特定 `ClassLoader` 装载 `Class` 的宿主应用,你可以使用此方法来监听 `Class` 加载情况。
!> 为了防止发生问题,你需要<u>**得到一个存在的 `ClassLoader` 实例**</u>来使用此功能。
比如我们使用 `appClassLoader`
> 示例如下
```kotlin
appClassLoader.fetching { clazz, resolve ->
// 得到 clazz 即加载对象
clazz... // 这里进行你需要的操作
// resolve 为 loadClass 的第二位参数,可参考官方文档的说明,一般情况下用不到
resolve // 类型为 Boolean
}
```
或使用你得到的存在的 `ClassLoader` 实例,可以通过 Hook 获取。
> 示例如下
```kotlin
val customClassLoader: ClassLoader? = ... // 假设这个就是你的 ClassLoader
customClassLoader?.fetching { clazz, resolve ->
// ...
}
```
在判断到这个 `Class` 被装载成功时,开始执行你的 Hook 功能。
> 示例如下
```kotlin
val customClassLoader: ClassLoader? = ... // 假设这个就是你的 ClassLoader
customClassLoader?.fetching { clazz, resolve ->
if(clazz.name == /** 你需要的 Class 名称 */) {
clazz.hook {
// ...
}
}
}
```
### String+Class+VariousClass+HookClass.hook *- i-ext-method*
```kotlin

View File

@@ -64,6 +64,69 @@ CONSTRUCTOR
> 全部 `Constructor`。
### ClassLoader.onLoadClass *- ext-method*
```kotlin
fun ClassLoader.onLoadClass(result: (Class<*>) -> Unit)
```
**变更记录**
`v1.0.93` `新增`
**功能描述**
> 监听当前 `ClassLoader` 的 `ClassLoader.loadClass` 方法装载。
!> 请注意只有当前 `ClassLoader` 有主动使用 `ClassLoader.loadClass` 事件时才能被捕获。
!> 这是一个实验性功能,一般情况下不会用到此方法,不保证不会发生错误。
!> 只能在 (Xposed) 宿主环境使用此功能,其它环境下使用将不生效且会打印警告信息。
**功能示例**
针对一些使用特定 `ClassLoader` 装载 `Class` 的宿主应用,你可以使用此方法来监听 `Class` 加载情况。
!> 为了防止发生问题,你需要<u>**得到一个存在的 `ClassLoader` 实例**</u>来使用此功能。
比如我们在 `PackageParam` 中使用 `appClassLoader`
> 示例如下
```kotlin
appClassLoader.onLoadClass { clazz ->
// 得到 clazz 即加载对象
clazz... // 这里进行你需要的操作
}
```
或使用你得到的存在的 `ClassLoader` 实例,可以通过 Hook 获取。
> 示例如下
```kotlin
val customClassLoader: ClassLoader? = ... // 假设这个就是你的 ClassLoader
customClassLoader?.onLoadClass { clazz ->
// ...
}
```
在判断到这个 `Class` 被装载成功时,开始执行你的 Hook 功能。
> 示例如下
```kotlin
val customClassLoader: ClassLoader? = ... // 假设这个就是你的 ClassLoader
customClassLoader?.onLoadClass { clazz ->
if(clazz.name == /** 你需要的 Class 名称 */) {
clazz.hook {
// ...
}
}
}
```
### ~~hookClass *- field*~~ <!-- {docsify-ignore} -->
**变更记录**

View File

@@ -152,7 +152,7 @@ fun useDangerousOperation(option: String)
你还需要在整个作用域中声明注解 `CauseProblemsApi` 以消除警告。
若你只需要 Hook `ClassLoader``loadClass` 方法,请参考 [ClassLoader.fetching](api/document?id=classloaderfetching-i-ext-method)。
若你只需要 Hook `ClassLoader``loadClass` 方法,请参考 [ClassLoader.onLoadClass](api/document?id=classloaderonloadclass-ext-method)。
!> 若你不知道允许此功能会带来何种后果,请勿使用。