- kt
ReflectionFactory变更记录
v1.0.0
添加
功能描述
这是自定义
Member
和Class
相关功能的查找匹配以及invoke
的封装类。
- class
LazyClassopen class LazyClass<T> internal constructor(
private val instance: Any,
private val initialize: Boolean,
private val loader: ClassLoaderInitializer?
)
变更记录
v1.0.3
新增
功能描述
懒装载
Class
实例。
- ext-method
ClassLoader.listOfClassesfun ClassLoader.listOfClasses(): List<String>
变更记录
v1.0.0
添加
功能描述
写出当前
ClassLoader
下所有Class
名称数组。
- ext-method
ClassLoader.searchClassinline fun ClassLoader.searchClass(context: Context?, name: String, async: Boolean, initiate: ClassConditions): DexClassFinder.Result
变更记录
v1.0.0
添加
功能描述
通过当前
ClassLoader
按指定条件查找并得到 Dex 中的Class
。
特别注意
此方法在 Class 数量过多及查找条件复杂时会非常耗时。
建议启用 async 或设置 name 参数,name 参数将在当前 APP 不同版本中自动进行本地缓存以提升效率。
如果使用了 async 或 name 参数,则必须填写 context 参数。
此功能尚在试验阶段,性能与稳定性可能仍然存在问题,使用过程遇到问题请向我们报告并帮助我们改进。
- ext-field
Class.hasExtendsval Class<*>.hasExtends: Boolean
变更记录
v1.0.0
添加
功能描述
当前
Class
是否有继承关系,父类是Any
将被认为没有继承关系。
- ext-method
Class?.extendsinfix fun Class<*>?.extends(other: Class<*>?): Boolean
变更记录
v1.0.0
添加
功能描述
当前
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.0.0
添加
功能描述
当前
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.0.0
添加
功能描述
当前
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.0.0
添加
功能描述
当前
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.0.0
添加
功能描述
自动转换当前
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
- ext-method
String.toClassfun String.toClass(loader: ClassLoader?, initialize: Boolean): Class<*>
inline fun <reified T> String.toClass(loader: ClassLoader?, initialize: Boolean): Class<T>
变更记录
v1.0.0
添加
功能描述
通过字符串类名转换为
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.0.0
添加
功能描述
通过字符串类名转换为
loader
中的实体类。
找不到 Class
会返回 null
,不会抛出异常。
功能示例
用法请参考 String.toClass 方法。
- method
classOfinline fun <reified T> classOf(loader: ClassLoader?, initialize: Boolean): Class<T>
变更记录
v1.0.0
添加
功能描述
通过
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.0.3
新增
功能描述
懒装载
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.0.3
新增
功能描述
懒装载
Class
。
- ext-method
String.hasClassfun String.hasClass(loader: ClassLoader?): Boolean
变更记录
v1.0.0
添加
功能描述
通过字符串类名使用指定的
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.0
添加
功能描述
查找变量是否存在。
- ext-method
Class.hasMethodinline fun Class<*>.hasMethod(initiate: MethodConditions): Boolean
变更记录
v1.0.0
添加
功能描述
查找方法是否存在。
- ext-method
Class.hasConstructorinline fun Class<*>.hasConstructor(initiate: ConstructorConditions): Boolean
变更记录
v1.0.0
添加
功能描述
查找构造方法是否存在。
- ext-method
Member.hasModifiersinline fun Member.hasModifiers(conditions: ModifierConditions): Boolean
变更记录
v1.0.0
添加
功能描述
查找
Member
中匹配的描述符。
- ext-method
Class.hasModifiersinline fun Class<*>.hasModifiers(conditions: ModifierConditions): Boolean
变更记录
v1.0.0
添加
功能描述
查找
Class
中匹配的描述符。
- ext-method
Class.fieldinline fun Class<*>.field(initiate: FieldConditions): FieldFinder.Result
变更记录
v1.0.0
添加
功能描述
查找并得到变量。
- ext-method
Class.methodinline fun Class<*>.method(initiate: MethodConditions): MethodFinder.Result
变更记录
v1.0.0
添加
功能描述
查找并得到方法。
- ext-method
Class.constructorinline fun Class<*>.constructor(initiate: ConstructorConditions): ConstructorFinder.Result
变更记录
v1.0.0
添加
功能描述
查找并得到构造方法。
- ext-method
Class.genericfun Class<*>.generic(): GenericClass?
变更记录
v1.0.0
添加
功能描述
获得当前
Class
的泛型父类。
如果当前实例不存在泛型将返回 null
。
- ext-method
Class.genericinline fun Class<*>.generic(initiate: GenericClass.() -> Unit): GenericClass?
变更记录
v1.0.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.0
添加
功能描述
获得当前实例的类操作对象。
- 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.0
添加
功能描述
通过构造方法创建新实例,指定类型
T
或任意类型Any
。
- ext-method
Class.allMethodsinline fun Class<*>.allMethods(isAccessible: Boolean, result: (index: Int, method: Method) -> Unit)
变更记录
v1.0.0
添加
功能描述
遍历当前类中的所有方法。
- ext-method
Class.allConstructorsinline fun Class<*>.allConstructors(isAccessible: Boolean, result: (index: Int, constructor: Constructor<*>) -> Unit)
变更记录
v1.0.0
添加
功能描述
遍历当前类中的所有构造方法。
- ext-method
Class.allFieldsinline fun Class<*>.allFields(isAccessible: Boolean, result: (index: Int, field: Field) -> Unit)
变更记录
v1.0.0
添加
功能描述
遍历当前类中的所有变量。