From cced5ded103503c11fc0e4acb50568b5ffe6cc7a Mon Sep 17 00:00:00 2001 From: Fankesyooni Date: Mon, 4 Apr 2022 02:12:59 +0800 Subject: [PATCH] Merge code --- .../yukihookapi/hook/bean/CurrentClass.kt | 55 +++++++++++++++++++ .../hook/factory/ReflectionFactory.kt | 23 ++++---- 2 files changed, 65 insertions(+), 13 deletions(-) create mode 100644 yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/bean/CurrentClass.kt diff --git a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/bean/CurrentClass.kt b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/bean/CurrentClass.kt new file mode 100644 index 00000000..d8903764 --- /dev/null +++ b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/bean/CurrentClass.kt @@ -0,0 +1,55 @@ +/* + * YukiHookAPI - An efficient Kotlin version of the Xposed Hook API. + * Copyright (C) 2019-2022 HighCapable + * https://github.com/fankes/YukiHookAPI + * + * MIT License + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * This file is Created by fankes on 2022/4/4. + */ +package com.highcapable.yukihookapi.hook.bean + +import com.highcapable.yukihookapi.hook.core.finder.FieldFinder +import com.highcapable.yukihookapi.hook.core.finder.MethodFinder +import com.highcapable.yukihookapi.hook.factory.field +import com.highcapable.yukihookapi.hook.factory.method + +/** + * 当前实例的类操作对象 + * @param instance 当前实例的 [Class] + * @param self 当前实例本身 + */ +class CurrentClass(private val instance: Class<*>, private val self: Any) { + + /** + * 调用当前实例中的变量 + * @param initiate 查找方法体 + * @return [FieldFinder.Result.Instance] + */ + fun field(initiate: FieldFinder.() -> Unit) = instance.field(initiate).get(self) + + /** + * 调用当前实例中的方法 + * @param initiate 查找方法体 + * @return [MethodFinder.Result.Instance] + */ + fun method(initiate: MethodFinder.() -> Unit) = instance.method(initiate).get(self) +} \ No newline at end of file diff --git a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/factory/ReflectionFactory.kt b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/factory/ReflectionFactory.kt index 380b9d73..3484a643 100644 --- a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/factory/ReflectionFactory.kt +++ b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/factory/ReflectionFactory.kt @@ -29,6 +29,7 @@ package com.highcapable.yukihookapi.hook.factory +import com.highcapable.yukihookapi.hook.bean.CurrentClass import com.highcapable.yukihookapi.hook.bean.HookClass import com.highcapable.yukihookapi.hook.core.finder.ConstructorFinder import com.highcapable.yukihookapi.hook.core.finder.FieldFinder @@ -137,18 +138,14 @@ fun Class<*>.method(initiate: MethodFinder.() -> Unit) = MethodFinder(classSet = fun Class<*>.constructor(initiate: ConstructorFinder.() -> Unit) = ConstructorFinder(classSet = this).apply(initiate).build() /** - * 调用当前实例中的变量 - * @param initiate 查找方法体 - * @return [FieldFinder.Result.Instance] + * 获得当前实例的类操作对象 + * @param initiate 方法体 + * @return [T] */ -fun Any.field(initiate: FieldFinder.() -> Unit) = javaClass.field(initiate).get(this) - -/** - * 调用当前实例中的方法 - * @param initiate 查找方法体 - * @return [MethodFinder.Result.Instance] - */ -fun Any.method(initiate: MethodFinder.() -> Unit) = javaClass.method(initiate).get(this) +inline fun T.current(initiate: CurrentClass.() -> Unit): T { + CurrentClass(javaClass, self = this).apply(initiate) + return this +} /** * 通过构造方法创建新实例 - 指定类型 [T] @@ -156,7 +153,7 @@ fun Any.method(initiate: MethodFinder.() -> Unit) = javaClass.method(initiate).g * @param initiate 查找方法体 * @return [T] or null */ -fun Class<*>.construct(vararg param: Any?, initiate: ConstructorFinder.() -> Unit = {}) = constructor(initiate).get().newInstance(*param) +fun Class<*>.buildOf(vararg param: Any?, initiate: ConstructorFinder.() -> Unit = {}) = constructor(initiate).get().newInstance(*param) /** * 通过构造方法创建新实例 - 任意类型 [Any] @@ -164,7 +161,7 @@ fun Class<*>.construct(vararg param: Any?, initiate: ConstructorFinder.() -> * @param initiate 查找方法体 * @return [Any] or null */ -fun Class<*>.constructAny(vararg param: Any?, initiate: ConstructorFinder.() -> Unit = {}) = construct(*param, initiate) +fun Class<*>.buildOfAny(vararg param: Any?, initiate: ConstructorFinder.() -> Unit = {}) = buildOf(*param, initiate) /** * 遍历当前类中的所有方法