This commit is contained in:
2022-02-11 22:52:50 +08:00
parent 4f4818515a
commit 6f98e769cf

View File

@@ -68,36 +68,38 @@ val HookClass.normalClass get() = instance
/** /**
* 查找方法是否存在 * 查找方法是否存在
* @param name 名称 * @param name 名称
* @param clazz params * @param paramType params
* @return [Boolean] 是否存在 * @return [Boolean] 是否存在
*/ */
fun Class<*>.hasMethod(name: String, vararg clazz: Class<*>): Boolean = fun Class<*>.hasMethod(name: String, vararg paramType: Class<*>): Boolean =
try { try {
getDeclaredMethod(name, *clazz) getDeclaredMethod(name, *paramType)
true true
} catch (_: Throwable) { } catch (_: Throwable) {
false false
} }
/** /**
* 查找静态 [Field] 的实例 * 查找并得到静态 [Field] 的实例
* @param name 名称 * @param name 名称
* @return [Any] 实例对象 * @return [T] 实例对象 or null
* @throws NoSuchFieldError * @throws NoSuchFieldError
*/ */
fun Class<*>.findStaticField(name: String): Any? = getDeclaredField(name).apply { isAccessible = true }[null] inline fun <reified T> Class<*>.obtainStaticFieldAny(name: String): T? =
getDeclaredField(name).apply { isAccessible = true }[null] as? T?
/** /**
* 查找 [Field] 的实例 * 查找并得到 [Field] 的实例
* @param any 对象 * @param any 对象
* @param name 名称 * @param name 名称
* @return [Any] 实例对象 * @return [T] 实例对象 or null
* @throws NoSuchFieldError * @throws NoSuchFieldError
*/ */
fun Class<*>.findField(any: Any?, name: String): Any? = getDeclaredField(name).apply { isAccessible = true }[any] inline fun <reified T> Class<*>.obtainFieldAny(any: Any?, name: String): T? =
getDeclaredField(name).apply { isAccessible = true }[any] as? T?
/** /**
* 修改静态 [Field] 实例内容 * 修改静态 [Field] 实例内容
* @param name 名称 * @param name 名称
* @param value 值 * @param value 值
* @throws NoSuchFieldError * @throws NoSuchFieldError
@@ -110,7 +112,7 @@ fun Class<*>.modifyStaticField(name: String, value: Any?) {
} }
/** /**
* 修改 [Field] 实例内容 * 修改 [Field] 实例内容
* @param any 对象 * @param any 对象
* @param name 名称 * @param name 名称
* @param value 值 * @param value 值
@@ -124,48 +126,39 @@ fun Class<*>.modifyField(any: Any?, name: String, value: Any?) {
} }
/** /**
* 查找目标变量 * 查找并得到方法
* @param name 方法名
* @return [Field]
* @throws NoSuchFieldError 如果找不到变量会报错
*/
fun Class<*>.findField(name: String): Field =
getDeclaredField(name).apply { isAccessible = true }
/**
* 得到方法
* @param name 方法名称 * @param name 方法名称
* @param clazz params * @param paramType params
* @return [Method] * @return [Method] or null
* @throws NoSuchMethodError * @throws NoSuchMethodError
*/ */
fun Class<*>.findMethod(name: String, vararg clazz: Class<*>): Method? = fun Class<*>.obtainMethod(name: String, vararg paramType: Class<*>): Method? =
getDeclaredMethod(name, *clazz).apply { isAccessible = true } getDeclaredMethod(name, *paramType).apply { isAccessible = true }
/** /**
* 得到构造类 * 查找并得到构造类
* @param parameterTypes params * @param paramType params
* @return [Constructor] * @return [Constructor] or null
* @throws NoSuchMethodError * @throws NoSuchMethodError
*/ */
fun Class<*>.findConstructor(vararg parameterTypes: Class<*>?): Constructor<out Any>? = fun Class<*>.obtainConstructor(vararg paramType: Class<*>): Constructor<out Any>? =
getDeclaredConstructor(*parameterTypes).apply { isAccessible = true } getDeclaredConstructor(*paramType).apply { isAccessible = true }
/** /**
* 执行方法 - 静态 * 执行静态方法
* @param anys 方法参数 * @param param 方法参数
* @return [T] * @return [T]
* @throws IllegalStateException 如果 [T] 类型错误 * @throws IllegalStateException 如果 [T] 类型错误
*/ */
inline fun <reified T> Method.invokeStatic(vararg anys: Any) = inline fun <reified T> Method.invokeStatic(vararg param: Any?) =
invoke(null, anys) as? T? ?: error("Method ReturnType cannot cast to ${T::class.java}") invoke(null, param) as? T? ?: error("Method ReturnType cannot cast to ${T::class.java}")
/** /**
* 执行方法 - 非静态 * 执行方法
* @param any 目标对象 * @param any 目标对象
* @param anys 方法参数 * @param param 方法参数
* @return [T] * @return [T]
* @throws IllegalStateException 如果 [T] 类型错误 * @throws IllegalStateException 如果 [T] 类型错误
*/ */
inline fun <reified T> Method.invokeAny(any: Any?, vararg anys: Any) = inline fun <reified T> Method.invokeAny(any: Any?, vararg param: Any?) =
invoke(any, anys) as? T? ?: error("Method ReturnType cannot cast to ${T::class.java}") invoke(any, param) as? T? ?: error("Method ReturnType cannot cast to ${T::class.java}")