Skip to content

Repository files navigation

Sword

License: Apache 2.0Maven Central

使用 kotlin compiler plugin 实现,目前仅作用于 Kotlin 函数,为 Kotlin 函数提供代理实现。

Implemented using kotlin compiler plugin, currently only applicable to Kotlin functions, providing proxy implementation for Kotlin functions.

集成

KotlinKSPSwordPluginId
1.9.211.9.21-1.0.150.0.4com.sunxiaodou.kotlin.sword.kcp
1.8.221.8.22-1.0.110.0.3com.sunxiaodou.kotlin.sword.kcp
1.7.101.7.10-1.0.60.0.2com.sunxiaodou.kotlin.sword.kcp

Top-level build.gradle.kts

plugins {
id("com.sunxiaodou.kotlin.sword.kcp") version "<latest-version>" apply false// Option KSP
id("com.google.devtools.ksp") version "<ksp-version>" apply false
}

Module-level build.gradle.kts

plugins {
id("com.sunxiaodou.kotlin.sword.kcp")
// Option KSP
id("com.google.devtools.ksp")
}
dependencies {
implementation("com.sunxiaodou.kotlin:sword-api-kt:<latest-version>")
// Option 为标记[InvocationHandler]的子类生成FqName索引类`HandlerFqNames`
ksp("com.sunxiaodou.kotlin:sword-compiler-ksp:<latest-version>")
}

Api

@Target(AnnotationTarget.FUNCTION)
@Retention(AnnotationRetention.BINARY)
annotationclassProxy(
/** * 是否启用, 默认True*/valenable:Boolean = true,
/** * [InvocationHandler]实现类的全限定名, 实现类必须有无参构造方法 * * e.g. com.example.ProxyTestInvocationHandler*/valhandler:String = "",
)
interfaceInvocationHandler {
funinvoke(className:String, methodName:String, args:Array<Any?>): Any?
}
/** * 标记[InvocationHandler]的子类, 为其生成FqName索引类`HandlerFqNames` * * 使用 ksp 实现 * * Created by guodongAndroid on 2022/8/17.*/
@Target(AnnotationTarget.CLASS)
@Retention(AnnotationRetention.BINARY)
annotationclassProxyHandler(
/** * 生成字段的名称, 默认为类名 * * `paramName`参数名称不要随意变动*/valparamName:String = ""
)

Proxy 注解中的 handler 参数注入 InvocationHandler 实现类的全限定名(Fully Qualified Name),其实现类必须有无参构造方法

Usage

classTest {
@Proxy(
enable =BuildConfig.isDebug,
handler =HandlerFqNames.GET_TEXT_NO_ARG
)
fungetTextNoArg() ="guodongAndroid"
@Proxy(
enable =BuildConfig.isDebug,
handler =HandlerFqNames.GetTextArgInvocationHandler
)
fungetTextArg(
b:Byte,
z:Boolean,
c:Char,
s:Short,
i:Int,
l:Long,
f:Float,
d:Double,
str:String,
ia:IntArray,
sa:Array<String>,
ls:List<String>,
lls:List<List<String>>,
map:Map<String, String>,
user:User,
callback:Callback,
): User {
returnUser("guodongAndroid-Release", 28)
}
}
@ProxyHandler
classGetTextArgInvocationHandler : InvocationHandler {
privatevalTAG=GetTextArgInvocationHandler::class.java.simpleName
overridefuninvoke(className:String, methodName:String, args:Array<Any?>): Any? {
Log.e(TAG, "invoke: className = $className, methodName = $methodName, args(${args.size}) = ${args.joinToString()}")
returnUser("guodongAndroid-Debug", 18)
}
}
@ProxyHandler("GET_TEXT_NO_ARG")
classGetTextNoArgInvocationHandler : InvocationHandler {
privatevalTAG=GetTextNoArgInvocationHandler::class.java.simpleName
overridefuninvoke(className:String, methodName:String, args:Array<Any?>): Any? {
Log.e(TAG, "invoke: className = $className, methodName = $methodName, args(${args.size}) = ${args.joinToString()}")
return"guodongAndroid-Debug"
}
}

HandlerFqNames

// The file is automatic generated by Sword, don't modify it.packagecom.guodong.android.sword.appimportkotlin.String/** * The class is automatic generated by Sword, don't modify it. * * [com.guodong.android.sword.api.kt.InvocationHandler]实现类的全限定名*/publicobject HandlerFqNames {
/** * [com.guodong.android.sword.app.GetTextArgInvocationHandler]*/publicconstvalGetTextArgInvocationHandler:String="com.guodong.android.sword.app.GetTextArgInvocationHandler"/** * [com.guodong.android.sword.app.GetTextNoArgInvocationHandler]*/publicconstvalGET_TEXT_NO_ARG:String="com.guodong.android.sword.app.GetTextNoArgInvocationHandler"
}

About

A kotlin function proxy library.

Resources

Stars

3 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages