Added Class.hasModifiers function in ReflectionFactory

This commit is contained in:
2022-09-04 21:21:01 +08:00
parent 63abd07537
commit 6d8d7bb86e
4 changed files with 96 additions and 51 deletions

View File

@@ -8,11 +8,15 @@ class ModifierRules internal constructor()
`v1.0.67` `新增` `v1.0.67` `新增`
`v1.0.93` `修改`
新增 `Class` 的描述符判断
**功能描述** **功能描述**
> 这是一个 `Member` 描述符定义类。 > 这是一个 `Class`、`Member` 描述符定义类。
可对 R8 混淆后的 `Member` 进行更加详细的定位。 可对 R8 混淆后的 `Class``Member` 进行更加详细的定位。
### ~~asPublic *- method*~~ <!-- {docsify-ignore} --> ### ~~asPublic *- method*~~ <!-- {docsify-ignore} -->
@@ -146,7 +150,7 @@ fun isPublic()
**功能描述** **功能描述**
> 添加描述 `Member` 类型包含 `public`。 > 添加描述 `Class`、`Member` 类型包含 `public`。
### isPrivate *- method* ### isPrivate *- method*
@@ -160,7 +164,7 @@ fun isPrivate()
**功能描述** **功能描述**
> 添加描述 `Member` 类型包含 `private`。 > 添加描述 `Class`、`Member` 类型包含 `private`。
### isProtected *- method* ### isProtected *- method*
@@ -174,7 +178,7 @@ fun isProtected()
**功能描述** **功能描述**
> 添加描述 `Member` 类型包含 `protected`。 > 添加描述 `Class`、`Member` 类型包含 `protected`。
### isStatic *- method* ### isStatic *- method*
@@ -188,9 +192,9 @@ fun isStatic()
**功能描述** **功能描述**
> 添加描述 `Member` 类型包含 `static`。 > 添加描述 `Class`、`Member` 类型包含 `static`。
对于任意的静态 `Member` 可添加此描述进行确定。 对于任意的静态 `Class``Member` 可添加此描述进行确定。
!> 特别注意 Kotlin -> Jvm 后的 `object` 类中的方法并不是静态的。 !> 特别注意 Kotlin -> Jvm 后的 `object` 类中的方法并不是静态的。
@@ -206,9 +210,9 @@ fun isFinal()
**功能描述** **功能描述**
> 添加描述 `Member` 类型包含 `final`。 > 添加描述 `Class`、`Member` 类型包含 `final`。
!> 特别注意在 Kotlin -> Jvm 后没有 `open` 标识的 `Member` 和没有任何关联的 `Member` 都将为 `final` !> 特别注意在 Kotlin -> Jvm 后没有 `open` 标识的 `Class``Member` 和没有任何关联的 `Class``Member` 都将为 `final`
### isSynchronized *- method* ### isSynchronized *- method*
@@ -222,7 +226,7 @@ fun isSynchronized()
**功能描述** **功能描述**
> 添加描述 `Member` 类型包含 `synchronized`。 > 添加描述 `Class`、`Member` 类型包含 `synchronized`。
### isVolatile *- method* ### isVolatile *- method*
@@ -236,7 +240,7 @@ fun isVolatile()
**功能描述** **功能描述**
> 添加描述 `Member` 类型包含 `volatile`。 > 添加描述 `Class`、`Member` 类型包含 `volatile`。
### isTransient *- method* ### isTransient *- method*
@@ -250,7 +254,7 @@ fun isTransient()
**功能描述** **功能描述**
> 添加描述 `Member` 类型包含 `transient`。 > 添加描述 `Class`、`Member` 类型包含 `transient`。
### isNative *- method* ### isNative *- method*
@@ -264,9 +268,9 @@ fun isNative()
**功能描述** **功能描述**
> 添加描述 `Member` 类型包含 `native`。 > 添加描述 `Class`、`Member` 类型包含 `native`。
对于任意 JNI 对接的 `Member` 可添加此描述进行确定。 对于任意 JNI 对接的 `Class``Member` 可添加此描述进行确定。
### isInterface *- method* ### isInterface *- method*
@@ -280,7 +284,7 @@ fun isInterface()
**功能描述** **功能描述**
> 添加描述 `Member` 类型包含 `interface`。 > 添加描述 `Class`、`Member` 类型包含 `interface`。
### isAbstract *- method* ### isAbstract *- method*
@@ -294,9 +298,9 @@ fun isAbstract()
**功能描述** **功能描述**
> 添加描述 `Member` 类型包含 `abstract`。 > 添加描述 `Class`、`Member` 类型包含 `abstract`。
对于任意的抽象 `Member` 可添加此描述进行确定。 对于任意的抽象 `Class``Member` 可添加此描述进行确定。
### isStrict *- method* ### isStrict *- method*
@@ -310,4 +314,4 @@ fun isStrict()
**功能描述** **功能描述**
> 添加描述 `Member` 类型包含 `strict` > 添加描述 `Class``Member` 类型包含 `strict`

View File

@@ -311,6 +311,20 @@ inline fun Member.hasModifiers(initiate: ModifierRules.() -> Unit): Boolean
> 查询 `Member` 中匹配的描述符。 > 查询 `Member` 中匹配的描述符。
### Class.hasModifiers *- ext-method*
```kotlin
inline fun Class<*>.hasModifiers(initiate: ModifierRules.() -> Unit): Boolean
```
**变更记录**
`v1.0.93` `新增`
**功能描述**
> 查询 `Class` 中匹配的描述符。
### ~~obtainStaticFieldAny *- method*~~ <!-- {docsify-ignore} --> ### ~~obtainStaticFieldAny *- method*~~ <!-- {docsify-ignore} -->
**变更记录** **变更记录**

View File

@@ -33,9 +33,9 @@ import java.lang.reflect.Member
import java.lang.reflect.Modifier import java.lang.reflect.Modifier
/** /**
* 这是一个 [Member] 描述符定义类 * 这是一个 [Class]、[Member] 描述符定义类
* *
* 可对 R8 混淆后的 [Member] 进行更加详细的定位 * 可对 R8 混淆后的 [Class]、[Member] 进行更加详细的定位
*/ */
class ModifierRules @PublishedApi internal constructor() { class ModifierRules @PublishedApi internal constructor() {
@@ -171,25 +171,25 @@ class ModifierRules @PublishedApi internal constructor() {
@Deprecated(message = "请使用新的命名方法", replaceWith = ReplaceWith(expression = "isStrict()")) @Deprecated(message = "请使用新的命名方法", replaceWith = ReplaceWith(expression = "isStrict()"))
fun asStrict() = isStrict() fun asStrict() = isStrict()
/** 添加描述 [Member] 类型包含 public */ /** 添加描述 [Class]、[Member] 类型包含 public */
fun isPublic() { fun isPublic() {
isPublic = true isPublic = true
} }
/** 添加描述 [Member] 类型包含 private */ /** 添加描述 [Class]、[Member] 类型包含 private */
fun isPrivate() { fun isPrivate() {
isPrivate = true isPrivate = true
} }
/** 添加描述 [Member] 类型包含 protected */ /** 添加描述 [Class]、[Member] 类型包含 protected */
fun isProtected() { fun isProtected() {
isProtected = true isProtected = true
} }
/** /**
* 添加描述 [Member] 类型包含 static * 添加描述 [Class]、[Member] 类型包含 static
* *
* 对于任意的静态 [Member] 可添加此描述进行确定 * 对于任意的静态 [Class]、[Member] 可添加此描述进行确定
* *
* - ❗注意 Kotlin → Jvm 后的 object 类中的方法并不是静态的 * - ❗注意 Kotlin → Jvm 后的 object 类中的方法并不是静态的
*/ */
@@ -198,77 +198,79 @@ class ModifierRules @PublishedApi internal constructor() {
} }
/** /**
* 添加描述 [Member] 类型包含 final * 添加描述 [Class]、[Member] 类型包含 final
* *
* - ❗注意 Kotlin → Jvm 后没有 open 标识的 [Member] 和没有任何关联的 [Member] 都将为 final * - ❗注意 Kotlin → Jvm 后没有 open 标识的 [Class]、[Member] 和没有任何关联的 [Class]、[Member] 都将为 final
*/ */
fun isFinal() { fun isFinal() {
isFinal = true isFinal = true
} }
/** 添加描述 [Member] 类型包含 synchronized */ /** 添加描述 [Class]、[Member] 类型包含 synchronized */
fun isSynchronized() { fun isSynchronized() {
isSynchronized = true isSynchronized = true
} }
/** 添加描述 [Member] 类型包含 volatile */ /** 添加描述 [Class]、[Member] 类型包含 volatile */
fun isVolatile() { fun isVolatile() {
isVolatile = true isVolatile = true
} }
/** 添加描述 [Member] 类型包含 transient */ /** 添加描述 [Class]、[Member] 类型包含 transient */
fun isTransient() { fun isTransient() {
isTransient = true isTransient = true
} }
/** /**
* 添加描述 [Member] 类型包含 native * 添加描述 [Class]、[Member] 类型包含 native
* *
* 对于任意 JNI 对接的 [Member] 可添加此描述进行确定 * 对于任意 JNI 对接的 [Class]、[Member] 可添加此描述进行确定
*/ */
fun isNative() { fun isNative() {
isNative = true isNative = true
} }
/** 添加描述 [Member] 类型包含 interface */ /** 添加描述 [Class]、[Member] 类型包含 interface */
fun isInterface() { fun isInterface() {
isInterface = true isInterface = true
} }
/** /**
* 添加描述 [Member] 类型包含 abstract * 添加描述 [Class]、[Member] 类型包含 abstract
* *
* 对于任意的抽象 [Member] 可添加此描述进行确定 * 对于任意的抽象 [Class]、[Member] 可添加此描述进行确定
*/ */
fun isAbstract() { fun isAbstract() {
isAbstract = true isAbstract = true
} }
/** 添加描述 [Member] 类型包含 strict */ /** 添加描述 [Class]、[Member] 类型包含 strict */
fun isStrict() { fun isStrict() {
isStrict = true isStrict = true
} }
/** /**
* 对比 [Member] 类型是否符合条件 * 对比 [Class]、[Member] 类型是否符合条件
* @param member 实例 * @param reflects 实例 - 只能是 [Class] or [Member]
* @return [Boolean] 是否符合条件 * @return [Boolean] 是否符合条件
*/ */
@PublishedApi @PublishedApi
internal fun contains(member: Member): Boolean { internal fun contains(reflects: Any): Boolean {
var conditions = true var conditions = true
if (isPublic) conditions = Modifier.isPublic(member.modifiers) Reflects(reflects).also {
if (isPrivate) conditions = conditions && Modifier.isPrivate(member.modifiers) if (isPublic) conditions = Modifier.isPublic(it.modifiers)
if (isProtected) conditions = conditions && Modifier.isProtected(member.modifiers) if (isPrivate) conditions = conditions && Modifier.isPrivate(it.modifiers)
if (isStatic) conditions = conditions && Modifier.isStatic(member.modifiers) if (isProtected) conditions = conditions && Modifier.isProtected(it.modifiers)
if (isFinal) conditions = conditions && Modifier.isFinal(member.modifiers) if (isStatic) conditions = conditions && Modifier.isStatic(it.modifiers)
if (isSynchronized) conditions = conditions && Modifier.isSynchronized(member.modifiers) if (isFinal) conditions = conditions && Modifier.isFinal(it.modifiers)
if (isVolatile) conditions = conditions && Modifier.isVolatile(member.modifiers) if (isSynchronized) conditions = conditions && Modifier.isSynchronized(it.modifiers)
if (isTransient) conditions = conditions && Modifier.isTransient(member.modifiers) if (isVolatile) conditions = conditions && Modifier.isVolatile(it.modifiers)
if (isNative) conditions = conditions && Modifier.isNative(member.modifiers) if (isTransient) conditions = conditions && Modifier.isTransient(it.modifiers)
if (isInterface) conditions = conditions && Modifier.isInterface(member.modifiers) if (isNative) conditions = conditions && Modifier.isNative(it.modifiers)
if (isAbstract) conditions = conditions && Modifier.isAbstract(member.modifiers) if (isInterface) conditions = conditions && Modifier.isInterface(it.modifiers)
if (isStrict) conditions = conditions && Modifier.isStrict(member.modifiers) if (isAbstract) conditions = conditions && Modifier.isAbstract(it.modifiers)
if (isStrict) conditions = conditions && Modifier.isStrict(it.modifiers)
}
return conditions return conditions
} }
@@ -288,4 +290,22 @@ class ModifierRules @PublishedApi internal constructor() {
if (isStrict) conditions += "<strict> " if (isStrict) conditions += "<strict> "
return "[${conditions.trim()}]" return "[${conditions.trim()}]"
} }
/**
* 实例化反射对象接口实现类
* @param reflects 反射对象实例
*/
private class Reflects(private val reflects: Any) {
/**
* 获取当前对象的类型描述符
* @return [Int]
*/
val modifiers
get() = when (reflects) {
is Member -> reflects.modifiers
is Class<*> -> reflects.modifiers
else -> error("Invalid reflects type")
}
}
} }

View File

@@ -144,6 +144,13 @@ inline fun Class<*>.hasConstructor(initiate: ConstructorCondition = { emptyParam
*/ */
inline fun Member.hasModifiers(initiate: ModifierRules.() -> Unit) = ModifierRules().apply(initiate).contains(this) inline fun Member.hasModifiers(initiate: ModifierRules.() -> Unit) = ModifierRules().apply(initiate).contains(this)
/**
* 查询 [Class] 中匹配的描述符
* @param initiate 方法体
* @return [Boolean] 是否存在
*/
inline fun Class<*>.hasModifiers(initiate: ModifierRules.() -> Unit) = ModifierRules().apply(initiate).contains(this)
/** /**
* 查找并得到变量 * 查找并得到变量
* @param initiate 查找方法体 * @param initiate 查找方法体