- kt
ReflectionFactory变更记录
v1.0
添加
功能描述
这是自定义
Member
和Class
相关功能的查找匹配以及invoke
的封装类。
- class
MembersTypeenum class MembersType
变更记录
v1.1.0
新增
功能描述
定义一个
Class
中的Member
类型
- enum
ALLALL
变更记录
v1.1.0
新增
功能描述
全部
Method
与Constructor
。
- enum
METHODMETHOD
变更记录
v1.1.0
新增
功能描述
全部
Method
。
- enum
CONSTRUCTORCONSTRUCTOR
变更记录
v1.1.0
新增
功能描述
全部
Constructor
。
- class
LazyClassopen class LazyClass<T> internal constructor(
private val instance: Any,
private val initialize: Boolean,
private val loader: ClassLoaderInitializer?
)
变更记录
v1.2.0
新增
功能描述
懒装载
Class
实例。
- ext-method
ClassLoader.listOfClassesfun ClassLoader.listOfClasses(): List<String>
变更记录
v1.1.2
新增
功能描述
写出当前
ClassLoader
下所有Class
名称数组。
- ext-method
ClassLoader.searchClassinline fun ClassLoader.searchClass(name: String, async: Boolean, initiate: ClassConditions): DexClassFinder.Result
变更记录
v1.1.0
新增
功能描述
通过当前
ClassLoader
按指定条件查找并得到 Dex 中的Class
。
特别注意
此方法在 Class 数量过多及查找条件复杂时会非常耗时。
建议启用 async 或设置 name 参数,name 参数将在 Hook APP (宿主) 不同版本中自动进行本地缓存以提升效率。
此功能尚在实验阶段,性能与稳定性可能仍然存在问题,使用过程遇到问题请向我们报告并帮助我们改进。
- ext-method
ClassLoader.onLoadClassfun ClassLoader.onLoadClass(result: (Class<*>) -> Unit)
变更记录
v1.1.0
新增
功能描述
监听当前
ClassLoader
的ClassLoader.loadClass
方法装载。
特别注意
只有当前 ClassLoader 有主动使用 ClassLoader.loadClass 事件时才能被捕获。
这是一个实验性功能,一般情况下不会用到此方法,不保证不会发生错误。
只能在 (Xposed) 宿主环境使用此功能,其它环境下使用将不生效且会打印警告信息。
功能示例
针对一些使用特定 ClassLoader
装载 Class
的宿主应用,你可以使用此方法来监听 Class
加载情况。
注意
为了防止发生问题,你需要得到一个存在的 ClassLoader 实例来使用此功能。
比如我们在 PackageParam
中使用 appClassLoader
。
示例如下
appClassLoader.onLoadClass { clazz ->
// 得到 clazz 即加载对象
clazz... // 这里进行你需要的操作
}
或使用你得到的存在的 ClassLoader
实例,可以通过 Hook 获取。
示例如下
val customClassLoader: ClassLoader? = ... // 假设这个就是你的 ClassLoader
customClassLoader?.onLoadClass { clazz ->
// ...
}
在判断到这个 Class
被装载成功时,开始执行你的 Hook 功能。
示例如下
val customClassLoader: ClassLoader? = ... // 假设这个就是你的 ClassLoader
customClassLoader?.onLoadClass { clazz ->
if(clazz.name == /** 你需要的 Class 名称 */) {
clazz.hook {
// ...
}
}
}
hookClass - field
变更记录
v1.0
添加
v1.1.0
移除
HookClass
相关功能不再对外开放
normalClass - field
变更记录
v1.0
添加
v1.1.0
移除
HookClass
相关功能不再对外开放
hasClass - field
变更记录
v1.0
添加
v1.1.0
移除
请直接使用 hasClass()
无参方法
- ext-field
Class.hasExtendsval Class<*>.hasExtends: Boolean
变更记录
v1.0.80
新增
功能描述
当前
Class
是否有继承关系,父类是Any
将被认为没有继承关系。
- ext-method
Class?.extendsinfix fun Class<*>?.extends(other: Class<*>?): Boolean
变更记录
v1.1.5
新增
功能描述
当前
Class
是否继承于other
。
如果当前 Class
就是 other
也会返回 true
。
如果当前 Class
为 null
或 other
为 null
会返回 false
。
功能示例
你可以使用此方法来判断两个 Class
是否存在继承关系。
示例如下
// 假设下面这两个 Class 就是你需要判断的 Class
val classA: Class<*>?
val classB: Class<*>?
// 判断 A 是否继承于 B
if (classA extends classB) {
// Your code here.
}
- ext-method
Class?.notExtendsinfix fun Class<*>?.notExtends(other: Class<*>?): Boolean
变更记录
v1.1.5
新增
功能描述
当前
Class
是否不继承于other
。
此方法相当于 extends
的反向判断。
功能示例
你可以使用此方法来判断两个 Class
是否不存在继承关系。
示例如下
// 假设下面这两个 Class 就是你需要判断的 Class
val classA: Class<*>?
val classB: Class<*>?
// 判断 A 是否不继承于 B
if (classA notExtends classB) {
// Your code here.
}
- ext-method
Class?.implementsinfix fun Class<*>?.implements(other: Class<*>?): Boolean
变更记录
v1.1.5
新增
功能描述
当前
Class
是否实现了other
接口类。
如果当前 Class
为 null
或 other
为 null
会返回 false
。
功能示例
你可以使用此方法来判断两个 Class
是否存在依赖关系。
示例如下
// 假设下面这两个 Class 就是你需要判断的 Class
val classA: Class<*>?
val classB: Class<*>?
// 判断 A 是否实现了 B 接口类
if (classA implements classB) {
// Your code here.
}
- ext-method
Class?.notImplementsinfix fun Class<*>?.notImplements(other: Class<*>?): Boolean
变更记录
v1.1.5
新增
功能描述
当前
Class
是否未实现other
接口类。
此方法相当于 implements
的反向判断。
功能示例
你可以使用此方法来判断两个 Class
是否不存在依赖关系。
示例如下
// 假设下面这两个 Class 就是你需要判断的 Class
val classA: Class<*>?
val classB: Class<*>?
// 判断 A 是否未实现 B 接口类
if (classA notImplements classB) {
// Your code here.
}
- ext-method
Class.toJavaPrimitiveTypefun Class<*>.toJavaPrimitiveType(): Class<*>
变更记录
v1.1.5
新增
功能描述
自动转换当前
Class
为 Java 原始类型 (Primitive Type)。
如果当前 Class
为 Java 或 Kotlin 基本类型将自动执行类型转换。
当前能够自动转换的基本类型如下。
kotlin.Unit
java.lang.Void
java.lang.Boolean
java.lang.Integer
java.lang.Float
java.lang.Double
java.lang.Long
java.lang.Short
java.lang.Character
java.lang.Byte
classOf - method
变更记录
v1.0
添加
v1.1.0
作废
请转到 toClass(...)
方法
- ext-method
String.toClassfun String.toClass(loader: ClassLoader?, initialize: Boolean): Class<*>
inline fun <reified T> String.toClass(loader: ClassLoader?, initialize: Boolean): Class<T>
变更记录
v1.1.0
新增
v1.1.5
修改
新增泛型返回值 Class<T>
方法
新增 initialize
参数
功能描述
通过字符串类名转换为
loader
中的实体类。
功能示例
你可以直接填写你要查找的目标 Class
,必须在默认 ClassLoader
下存在。
示例如下
"com.example.demo.DemoClass".toClass()
你还可以自定义 Class
所在的 ClassLoader
。
示例如下
val customClassLoader: ClassLoader? = ... // 假设这个就是你的 ClassLoader
"com.example.demo.DemoClass".toClass(customClassLoader)
你还可以指定 Class
的目标类型。
示例如下
// 指定的 DemoClass 必须存在或为可访问的 stub
"com.example.demo.DemoClass".toClass<DemoClass>()
你还可以设置在获取到这个 Class
时是否自动执行其默认的静态方法块,默认情况下不会执行。
示例如下
// 获取并执行 DemoClass 默认的静态方法块
"com.example.demo.DemoClass".toClass(initialize = true)
默认的静态方法块在 Java 中使用如下方式定义。
示例如下
public class DemoClass {
static {
// 这里是静态方法块的内容
}
public DemoClass() {
// ...
}
}
- ext-method
String.toClassOrNullfun String.toClassOrNull(loader: ClassLoader?, initialize: Boolean): Class<*>?
inline fun <reified T> String.toClassOrNull(loader: ClassLoader?, initialize: Boolean): Class<T>?
变更记录
v1.1.0
新增
v1.1.5
修改
新增泛型返回值 Class<T>
方法
新增 initialize
参数
功能描述
通过字符串类名转换为
loader
中的实体类。
找不到 Class
会返回 null
,不会抛出异常。
功能示例
用法请参考 String.toClass 方法。
- method
classOfinline fun <reified T> classOf(loader: ClassLoader?, initialize: Boolean): Class<T>
变更记录
v1.1.0
新增
v1.1.5
修改
将返回类型由 Class<*>
cast 为 Class<T>
新增 initialize
参数
功能描述
通过
T
得到其Class
实例并转换为实体类。
功能示例
我们要获取一个 Class
在 Kotlin 下不通过反射时应该这样做。
示例如下
DemoClass::class.java
现在,你可以直接 cast
一个实例并获取它的 Class
对象,必须在当前 ClassLoader
下存在。
示例如下
classOf<DemoClass>()
若目标存在的 Class
为 stub
,通过这种方式,你还可以自定义 Class
所在的 ClassLoader
。
示例如下
val customClassLoader: ClassLoader? = ... // 假设这个就是你的 ClassLoader
classOf<DemoClass>(customClassLoader)
- method
lazyClassfun lazyClass(name: String, initialize: Boolean, loader: ClassLoaderInitializer?): LazyClass.NonNull<Any>
inline fun <reified T> lazyClass(name: String, initialize: Boolean, loader: ClassLoaderInitializer?): LazyClass.NonNull<T>
fun lazyClass(variousClass: VariousClass, initialize: Boolean, loader: ClassLoaderInitializer?): LazyClass.NonNull<Any>
变更记录
v1.2.0
新增
功能描述
懒装载
Class
。
- method
lazyClassOrNullfun lazyClassOrNull(name: String, initialize: Boolean, loader: ClassLoaderInitializer?): LazyClass.Nullable<Any>
inline fun <reified T> lazyClassOrNull(name: String, initialize: Boolean, loader: ClassLoaderInitializer?): LazyClass.Nullable<T>
fun lazyClassOrNull(variousClass: VariousClass, initialize: Boolean, loader: ClassLoaderInitializer?): LazyClass.Nullable<Any>
变更记录
v1.2.0
新增
功能描述
懒装载
Class
。
- ext-method
String.hasClassfun String.hasClass(loader: ClassLoader?): Boolean
变更记录
v1.0
添加
v1.1.0
修改
支持直接使用空参数方法使用默认 ClassLoader
进行判断
功能描述
通过字符串类名使用指定的
ClassLoader
查找是否存在。
功能示例
你可以轻松的使用此方法判断字符串中的类是否存在,效果等同于直接使用 Class.forName
。
示例如下
if("com.example.demo.DemoClass".hasClass()) {
// Your code here.
}
填入方法中的 loader
参数可判断指定的 ClassLoader
中的 Class
是否存在。
示例如下
val customClassLoader: ClassLoader? = ... // 假设这个就是你的 ClassLoader
if("com.example.demo.DemoClass".hasClass(customClassLoader)) {
// Your code here.
}
- ext-method
Class.hasFieldinline fun Class<*>.hasField(initiate: FieldConditions): Boolean
变更记录
v1.0.4
新增
v1.0.67
修改
合并到 FieldFinder
v1.0.80
修改
将方法体进行 inline
功能描述
查找变量是否存在。
- ext-method
Class.hasMethodinline fun Class<*>.hasMethod(initiate: MethodConditions): Boolean
变更记录
v1.0
添加
v1.0.1
修改
新增 returnType
参数
v1.0.67
修改
合并到 MethodFinder
v1.0.80
修改
将方法体进行 inline
功能描述
查找方法是否存在。
- ext-method
Class.hasConstructorinline fun Class<*>.hasConstructor(initiate: ConstructorConditions): Boolean
变更记录
v1.0.2
新增
v1.0.67
修改
合并到 ConstructorFinder
v1.0.80
修改
将方法体进行 inline
功能描述
查找构造方法是否存在。
- ext-method
Member.hasModifiersinline fun Member.hasModifiers(conditions: ModifierConditions): Boolean
变更记录
v1.0.67
新增
v1.0.80
修改
将方法体进行 inline
v1.1.0
修改
合并到 ModifierConditions
功能描述
查找
Member
中匹配的描述符。
- ext-method
Class.hasModifiersinline fun Class<*>.hasModifiers(conditions: ModifierConditions): Boolean
变更记录
v1.1.0
新增
功能描述
查找
Class
中匹配的描述符。
obtainStaticFieldAny - method
变更记录
v1.0
添加
v1.0.1
移除
obtainFieldAny - method
变更记录
v1.0
添加
v1.0.1
移除
modifyStaticField - method
变更记录
v1.0
添加
v1.0.1
移除
modifyField - method
变更记录
v1.0
添加
v1.0.1
移除
- ext-method
Class.fieldinline fun Class<*>.field(initiate: FieldConditions): FieldFinder.Result
变更记录
v1.0.2
新增
v1.0.80
修改
将方法体进行 inline
功能描述
查找并得到变量。
- ext-method
Class.methodinline fun Class<*>.method(initiate: MethodConditions): MethodFinder.Result
变更记录
v1.0
添加
v1.0.1
修改
更名为 obtainMethod
method
新增 returnType
参数
v1.0.2
修改
合并到 MethodFinder
方法体
v1.0.80
修改
将方法体进行 inline
功能描述
查找并得到方法。
- ext-method
Class.constructorinline fun Class<*>.constructor(initiate: ConstructorConditions): ConstructorFinder.Result
变更记录
v1.0
添加
v1.0.1
修改
更名为 obtainConstructor
constructor
v1.0.2
修改
合并到 ConstructorFinder
方法体
v1.0.80
修改
将方法体进行 inline
功能描述
查找并得到构造方法。
callStatic - method
变更记录
v1.0
添加
v1.0.1
修改
更名为 invokeStatic
callStatic
v1.0.2
移除
call - method
变更记录
v1.0
添加
v1.0.1
修改
更名为 invokeAny
call
v1.0.2
移除
- ext-method
Class.genericfun Class<*>.generic(): GenericClass?
变更记录
v1.1.0
新增
功能描述
获得当前
Class
的泛型父类。
如果当前实例不存在泛型将返回 null
。
- ext-method
Class.genericinline fun Class<*>.generic(initiate: GenericClass.() -> Unit): GenericClass?
变更记录
v1.1.0
新增
功能描述
获得当前
Class
的泛型父类。
如果当前实例不存在泛型将返回 null
。
- ext-method
Any.currentinline fun <reified T : Any> T.current(ignored: Boolean): CurrentClass
inline fun <reified T : Any> T.current(ignored: Boolean, initiate: CurrentClass.() -> Unit): T
变更记录
v1.0.70
新增
v1.1.0
新增
新增 ignored
参数,可以忽略在 CurrentClass
中出现的异常
新增不使用 current { ... }
调用域直接使用 current()
得到实例的类操作对象
功能描述
获得当前实例的类操作对象。
Class.buildOfAny - ext-method
变更记录
v1.0.70
新增
v1.0.80
修改
将方法体进行 inline
v1.1.0
作废
请迁移到 buildOf
方法
- ext-method
Class.buildOfinline fun Class<*>.buildOf(vararg args: Any?, initiate: ConstructorConditions): Any?
inline fun <T> Class<*>.buildOf(vararg args: Any?, initiate: ConstructorConditions): T?
变更记录
v1.0.70
新增
v1.0.80
修改
将方法体进行 inline
v1.1.0
修改
加入无泛型方法 buildOf
v1.1.6
修改
修改参数命名 param
为 args
功能描述
通过构造方法创建新实例,指定类型
T
或任意类型Any
。
- ext-method
Class.allMethodsinline fun Class<*>.allMethods(isAccessible: Boolean, result: (index: Int, method: Method) -> Unit)
变更记录
v1.0.70
新增
v1.0.80
修改
将方法体进行 inline
v1.1.5
修改
新增 isAccessible
参数
功能描述
遍历当前类中的所有方法。
- ext-method
Class.allConstructorsinline fun Class<*>.allConstructors(isAccessible: Boolean, result: (index: Int, constructor: Constructor<*>) -> Unit)
变更记录
v1.0.70
新增
v1.0.80
修改
将方法体进行 inline
v1.1.5
修改
新增 isAccessible
参数
功能描述
遍历当前类中的所有构造方法。
- ext-method
Class.allFieldsinline fun Class<*>.allFields(isAccessible: Boolean, result: (index: Int, field: Field) -> Unit)
变更记录
v1.0.70
新增
v1.0.80
修改
将方法体进行 inline
v1.1.5
修改
新增 isAccessible
参数
功能描述
遍历当前类中的所有变量。