Modify move "throw createException" content to function templates in FieldRulesData, MethodRulesData, ConstructorRulesData, MemberRulesData, BaseRulesData and make modifiers condition visible

This commit is contained in:
2022-09-17 13:16:48 +08:00
parent 35bffae9ff
commit 130f66baca
8 changed files with 97 additions and 64 deletions

View File

@@ -31,6 +31,7 @@ import com.highcapable.yukihookapi.hook.core.finder.base.rules.CountRules
import com.highcapable.yukihookapi.hook.core.finder.base.rules.ModifierRules import com.highcapable.yukihookapi.hook.core.finder.base.rules.ModifierRules
import com.highcapable.yukihookapi.hook.core.finder.base.rules.NameRules import com.highcapable.yukihookapi.hook.core.finder.base.rules.NameRules
import com.highcapable.yukihookapi.hook.core.finder.type.factory.ModifierConditions import com.highcapable.yukihookapi.hook.core.finder.type.factory.ModifierConditions
import com.highcapable.yukihookapi.hook.type.defined.VagueType
import java.lang.reflect.Member import java.lang.reflect.Member
/** /**
@@ -46,6 +47,13 @@ internal abstract class BaseRulesData internal constructor(
var matchIndex: Pair<Int, Boolean>? = null var matchIndex: Pair<Int, Boolean>? = null
) { ) {
/** 当前类唯一标识值 */
internal var uniqueValue = 0L
init {
uniqueValue = System.currentTimeMillis()
}
/** /**
* [String] 转换为 [NameRules] * [String] 转换为 [NameRules]
* @return [NameRules] * @return [NameRules]
@@ -62,13 +70,34 @@ internal abstract class BaseRulesData internal constructor(
* [Class] 转换为 [ModifierRules] * [Class] 转换为 [ModifierRules]
* @return [ModifierRules] * @return [ModifierRules]
*/ */
internal fun Class<*>.cast() = ModifierRules.with(this) internal fun Class<*>.cast() = ModifierRules.with(instance = this, uniqueValue)
/** /**
* [Member] 转换为 [ModifierRules] * [Member] 转换为 [ModifierRules]
* @return [ModifierRules] * @return [ModifierRules]
*/ */
internal fun Member.cast() = ModifierRules.with(this) internal fun Member.cast() = ModifierRules.with(instance = this, uniqueValue)
/**
* 获取参数数组文本化内容
* @return [String]
*/
internal fun Array<out Class<*>>?.typeOfString() =
StringBuilder("(").also { sb ->
var isFirst = true
if (this == null || isEmpty()) return "()"
forEach {
if (isFirst) isFirst = false else sb.append(", ")
sb.append(it.takeIf { it.canonicalName != VagueType.canonicalName }?.canonicalName ?: "*vague*")
}
sb.append(")")
}.toString()
/**
* 获取规则对象模板字符串数组
* @return [Array]<[String]>
*/
internal abstract val templates: Array<String>
/** /**
* 获取规则对象名称 * 获取规则对象名称

View File

@@ -45,15 +45,29 @@ class ModifierRules private constructor(private val instance: Any) {
@PublishedApi @PublishedApi
internal companion object { internal companion object {
/** 当前实例数组 */
private val instances = HashMap<Long, ModifierRules>()
/**
* 获取模板字符串数组
* @param value 唯一标识值
* @return [ArrayList]<[String]>
*/
internal fun templates(value: Long) = instances[value]?.templates ?: arrayListOf()
/** /**
* 创建实例 * 创建实例
* @param instance 实例对象 * @param instance 实例对象
* @param value 唯一标识值 - 默认 0
* @return [ModifierRules] * @return [ModifierRules]
*/ */
@PublishedApi @PublishedApi
internal fun with(instance: Any) = ModifierRules(instance) internal fun with(instance: Any, value: Long = 0) = ModifierRules(instance).apply { instances[value] = this }
} }
/** 当前模板字符串数组 */
private val templates = ArrayList<String>()
/** /**
* [Class]、[Member] 类型是否包含 public * [Class]、[Member] 类型是否包含 public
* *
@@ -64,7 +78,7 @@ class ModifierRules private constructor(private val instance: Any) {
* ^^^ * ^^^
* @return [Boolean] * @return [Boolean]
*/ */
val isPublic get() = Modifier.isPublic(modifiers) val isPublic get() = Modifier.isPublic(modifiers).also { templates.add("<isPublic> ($it)") }
/** /**
* [Class]、[Member] 类型是否包含 private * [Class]、[Member] 类型是否包含 private
@@ -76,7 +90,7 @@ class ModifierRules private constructor(private val instance: Any) {
* ^^^ * ^^^
* @return [Boolean] * @return [Boolean]
*/ */
val isPrivate get() = Modifier.isPrivate(modifiers) val isPrivate get() = Modifier.isPrivate(modifiers).also { templates.add("<isPrivate> ($it)") }
/** /**
* [Class]、[Member] 类型是否包含 protected * [Class]、[Member] 类型是否包含 protected
@@ -88,7 +102,7 @@ class ModifierRules private constructor(private val instance: Any) {
* ^^^ * ^^^
* @return [Boolean] * @return [Boolean]
*/ */
val isProtected get() = Modifier.isProtected(modifiers) val isProtected get() = Modifier.isProtected(modifiers).also { templates.add("<isProtected> ($it)") }
/** /**
* [Class]、[Member] 类型是否包含 static * [Class]、[Member] 类型是否包含 static
@@ -104,7 +118,7 @@ class ModifierRules private constructor(private val instance: Any) {
* - ❗注意 Kotlin → Jvm 后的 object 类中的方法并不是静态的 * - ❗注意 Kotlin → Jvm 后的 object 类中的方法并不是静态的
* @return [Boolean] * @return [Boolean]
*/ */
val isStatic get() = Modifier.isStatic(modifiers) val isStatic get() = Modifier.isStatic(modifiers).also { templates.add("<isStatic> ($it)") }
/** /**
* [Class]、[Member] 类型是否包含 final * [Class]、[Member] 类型是否包含 final
@@ -118,7 +132,7 @@ class ModifierRules private constructor(private val instance: Any) {
* - ❗注意 Kotlin → Jvm 后没有 open 标识的 [Class]、[Member] 和没有任何关联的 [Class]、[Member] 都将为 final * - ❗注意 Kotlin → Jvm 后没有 open 标识的 [Class]、[Member] 和没有任何关联的 [Class]、[Member] 都将为 final
* @return [Boolean] * @return [Boolean]
*/ */
val isFinal get() = Modifier.isFinal(modifiers) val isFinal get() = Modifier.isFinal(modifiers).also { templates.add("<isFinal> ($it)") }
/** /**
* [Class]、[Member] 类型是否包含 synchronized * [Class]、[Member] 类型是否包含 synchronized
@@ -130,7 +144,7 @@ class ModifierRules private constructor(private val instance: Any) {
* ^^^ * ^^^
* @return [Boolean] * @return [Boolean]
*/ */
val isSynchronized get() = Modifier.isSynchronized(modifiers) val isSynchronized get() = Modifier.isSynchronized(modifiers).also { templates.add("<isSynchronized> ($it)") }
/** /**
* [Field] 类型是否包含 volatile * [Field] 类型是否包含 volatile
@@ -142,7 +156,7 @@ class ModifierRules private constructor(private val instance: Any) {
* ^^^ * ^^^
* @return [Boolean] * @return [Boolean]
*/ */
val isVolatile get() = Modifier.isVolatile(modifiers) val isVolatile get() = Modifier.isVolatile(modifiers).also { templates.add("<isVolatile> ($it)") }
/** /**
* [Field] 类型是否包含 transient * [Field] 类型是否包含 transient
@@ -154,7 +168,7 @@ class ModifierRules private constructor(private val instance: Any) {
* ^^^ * ^^^
* @return [Boolean] * @return [Boolean]
*/ */
val isTransient get() = Modifier.isTransient(modifiers) val isTransient get() = Modifier.isTransient(modifiers).also { templates.add("<isTransient> ($it)") }
/** /**
* [Method] 类型是否包含 native * [Method] 类型是否包含 native
@@ -168,7 +182,7 @@ class ModifierRules private constructor(private val instance: Any) {
* ^^^ * ^^^
* @return [Boolean] * @return [Boolean]
*/ */
val isNative get() = Modifier.isNative(modifiers) val isNative get() = Modifier.isNative(modifiers).also { templates.add("<isNative> ($it)") }
/** /**
* [Class] 类型是否包含 interface * [Class] 类型是否包含 interface
@@ -180,7 +194,7 @@ class ModifierRules private constructor(private val instance: Any) {
* ^^^ * ^^^
* @return [Boolean] * @return [Boolean]
*/ */
val isInterface get() = Modifier.isInterface(modifiers) val isInterface get() = Modifier.isInterface(modifiers).also { templates.add("<isInterface> ($it)") }
/** /**
* [Class]、[Member] 类型是否包含 abstract * [Class]、[Member] 类型是否包含 abstract
@@ -194,7 +208,7 @@ class ModifierRules private constructor(private val instance: Any) {
* ^^^ * ^^^
* @return [Boolean] * @return [Boolean]
*/ */
val isAbstract get() = Modifier.isAbstract(modifiers) val isAbstract get() = Modifier.isAbstract(modifiers).also { templates.add("<isAbstract> ($it)") }
/** /**
* [Class]、[Member] 类型是否包含 strictfp * [Class]、[Member] 类型是否包含 strictfp
@@ -206,7 +220,7 @@ class ModifierRules private constructor(private val instance: Any) {
* ^^^ * ^^^
* @return [Boolean] * @return [Boolean]
*/ */
val isStrict get() = Modifier.isStrict(modifiers) val isStrict get() = Modifier.isStrict(modifiers).also { templates.add("<isStrict> ($it)") }
/** /**
* 获取当前对象的类型描述符 * 获取当前对象的类型描述符

View File

@@ -45,6 +45,14 @@ internal class ConstructorRulesData internal constructor(
var paramCountConditions: CountConditions? = null var paramCountConditions: CountConditions? = null
) : MemberRulesData() { ) : MemberRulesData() {
override val templates
get() = arrayOf(
paramCount.takeIf { it >= 0 }?.let { "paramCount:[$it]" } ?: "",
paramCountRange.takeIf { it.isEmpty().not() }?.let { "paramCountRange:[$it]" } ?: "",
paramCountConditions?.let { "paramCountConditions:[existed]" } ?: "",
paramTypes?.typeOfString()?.let { "paramTypes:[$it]" } ?: "", *super.templates
)
override val objectName get() = "Constructor" override val objectName get() = "Constructor"
override val isInitialize override val isInitialize

View File

@@ -43,6 +43,13 @@ internal class FieldRulesData internal constructor(
var type: Any? = null var type: Any? = null
) : MemberRulesData() { ) : MemberRulesData() {
override val templates
get() = arrayOf(
name.takeIf { it.isNotBlank() }?.let { "name:[$it]" } ?: "",
nameConditions?.let { "nameConditions:$it" } ?: "",
type?.let { "type:[$it]" } ?: "", *super.templates
)
override val objectName get() = "Field" override val objectName get() = "Field"
override val isInitialize get() = super.isInitializeOfSuper || name.isNotBlank() || nameConditions != null || type != null override val isInitialize get() = super.isInitializeOfSuper || name.isNotBlank() || nameConditions != null || type != null

View File

@@ -28,6 +28,7 @@
package com.highcapable.yukihookapi.hook.core.finder.members.data package com.highcapable.yukihookapi.hook.core.finder.members.data
import com.highcapable.yukihookapi.hook.core.finder.base.data.BaseRulesData import com.highcapable.yukihookapi.hook.core.finder.base.data.BaseRulesData
import com.highcapable.yukihookapi.hook.core.finder.base.rules.ModifierRules
import com.highcapable.yukihookapi.hook.core.finder.type.factory.CountConditions import com.highcapable.yukihookapi.hook.core.finder.type.factory.CountConditions
import java.lang.reflect.Member import java.lang.reflect.Member
@@ -46,6 +47,13 @@ internal open class MemberRulesData internal constructor(
var matchCountConditions: CountConditions? = null var matchCountConditions: CountConditions? = null
) : BaseRulesData() { ) : BaseRulesData() {
override val templates
get() = arrayOf(
modifiers?.let { "modifiers:${ModifierRules.templates(uniqueValue)}" } ?: "",
orderIndex?.let { it.takeIf { it.second }?.let { e -> "orderIndex:[${e.first}]" } ?: "orderIndex:[last]" } ?: "",
matchIndex?.let { it.takeIf { it.second }?.let { e -> "matchIndex:[${e.first}]" } ?: "matchIndex:[last]" } ?: ""
)
override val objectName get() = "Member" override val objectName get() = "Member"
/** /**

View File

@@ -52,6 +52,17 @@ internal class MethodRulesData internal constructor(
var returnType: Any? = null var returnType: Any? = null
) : MemberRulesData() { ) : MemberRulesData() {
override val templates
get() = arrayOf(
name.takeIf { it.isNotBlank() }?.let { "name:[$it]" } ?: "",
nameConditions?.let { "nameConditions:$it" } ?: "",
paramCount.takeIf { it >= 0 }?.let { "paramCount:[$it]" } ?: "",
paramCountRange.takeIf { it.isEmpty().not() }?.let { "paramCountRange:[$it]" } ?: "",
paramCountConditions?.let { "paramCountConditions:[existed]" } ?: "",
paramTypes?.typeOfString()?.let { "paramTypes:[$it]" } ?: "",
returnType?.let { "returnType:[$it]" } ?: "", *super.templates
)
override val objectName get() = "Method" override val objectName get() = "Method"
override val isInitialize override val isInitialize

View File

@@ -371,38 +371,9 @@ internal object ReflectionTool {
* @throws IllegalStateException 如果 [BaseRulesData] 的类型错误 * @throws IllegalStateException 如果 [BaseRulesData] 的类型错误
*/ */
private fun BaseRulesData.throwNotFoundError(instanceSet: Any?): Nothing = when (this) { private fun BaseRulesData.throwNotFoundError(instanceSet: Any?): Nothing = when (this) {
is FieldRulesData -> throw createException( is FieldRulesData -> throw createException(instanceSet, objectName, *templates)
instanceSet, name = "Field", is MethodRulesData -> throw createException(instanceSet, objectName, *templates)
name.takeIf { it.isNotBlank() }?.let { "name:[$it]" } ?: "", is ConstructorRulesData -> throw createException(instanceSet, objectName, *templates)
nameConditions?.let { "nameConditions:$it" } ?: "",
type?.let { "type:[$it]" } ?: "",
modifiers?.let { "modifiers:[existed]" } ?: "",
orderIndex?.let { it.takeIf { it.second }?.let { e -> "orderIndex:[${e.first}]" } ?: "orderIndex:[last]" } ?: "",
matchIndex?.let { it.takeIf { it.second }?.let { e -> "matchIndex:[${e.first}]" } ?: "matchIndex:[last]" } ?: ""
)
is MethodRulesData -> throw createException(
instanceSet, name = "Method",
name.takeIf { it.isNotBlank() }?.let { "name:[$it]" } ?: "",
nameConditions?.let { "nameConditions:$it" } ?: "",
paramCount.takeIf { it >= 0 }?.let { "paramCount:[$it]" } ?: "",
paramCountRange.takeIf { it.isEmpty().not() }?.let { "paramCountRange:[$it]" } ?: "",
paramCountConditions?.let { "paramCountConditions:[existed]" } ?: "",
paramTypes?.typeOfString()?.let { "paramTypes:[$it]" } ?: "",
returnType?.let { "returnType:[$it]" } ?: "",
modifiers?.let { "modifiers:[existed]" } ?: "",
orderIndex?.let { it.takeIf { it.second }?.let { e -> "orderIndex:[${e.first}]" } ?: "orderIndex:[last]" } ?: "",
matchIndex?.let { it.takeIf { it.second }?.let { e -> "matchIndex:[${e.first}]" } ?: "matchIndex:[last]" } ?: ""
)
is ConstructorRulesData -> throw createException(
instanceSet, name = "Constructor",
paramCount.takeIf { it >= 0 }?.let { "paramCount:[$it]" } ?: "",
paramCountRange.takeIf { it.isEmpty().not() }?.let { "paramCountRange:[$it]" } ?: "",
paramCountConditions?.let { "paramCountConditions:[existed]" } ?: "",
paramTypes?.typeOfString()?.let { "paramTypes:[$it]" } ?: "",
modifiers?.let { "modifiers:[existed]" } ?: "",
orderIndex?.let { it.takeIf { it.second }?.let { e -> "orderIndex:[${e.first}]" } ?: "orderIndex:[last]" } ?: "",
matchIndex?.let { it.takeIf { it.second }?.let { e -> "matchIndex:[${e.first}]" } ?: "matchIndex:[last]" } ?: ""
)
else -> error("Type [$this] not allowed") else -> error("Type [$this] not allowed")
} }
@@ -483,21 +454,6 @@ internal object ReflectionTool {
yLoggerW(msg = "Failed to get the declared Constructors in [$this] because got an exception\n$it") yLoggerW(msg = "Failed to get the declared Constructors in [$this] because got an exception\n$it")
}.getOrNull() }.getOrNull()
/**
* 获取参数数组文本化内容
* @return [String]
*/
private fun Array<out Class<*>>?.typeOfString() =
StringBuilder("(").also { sb ->
var isFirst = true
if (this == null || isEmpty()) return "()"
forEach {
if (isFirst) isFirst = false else sb.append(",")
sb.append(it.canonicalName)
}
sb.append(")")
}.toString()
/** /**
* 判断两个方法、构造方法类型数组是否相等 * 判断两个方法、构造方法类型数组是否相等
* *

View File

@@ -140,14 +140,14 @@ inline fun Class<*>.hasConstructor(initiate: ConstructorConditions = { emptyPara
* @param conditions 条件方法体 * @param conditions 条件方法体
* @return [Boolean] 是否存在 * @return [Boolean] 是否存在
*/ */
inline fun Member.hasModifiers(conditions: ModifierConditions) = conditions(ModifierRules.with(this)) inline fun Member.hasModifiers(conditions: ModifierConditions) = conditions(ModifierRules.with(instance = this))
/** /**
* 查询 [Class] 中匹配的描述符 * 查询 [Class] 中匹配的描述符
* @param conditions 条件方法体 * @param conditions 条件方法体
* @return [Boolean] 是否存在 * @return [Boolean] 是否存在
*/ */
inline fun Class<*>.hasModifiers(conditions: ModifierConditions) = conditions(ModifierRules.with(this)) inline fun Class<*>.hasModifiers(conditions: ModifierConditions) = conditions(ModifierRules.with(instance = this))
/** /**
* 查找并得到变量 * 查找并得到变量