权且给自己记录一下吧
接口(注意,JDK 动态代理需要被代理类实现接口,如果被代理类没有实现接口,可以考虑使用CGLIB进行代理):
package dynamic.jdk
interface TestDao {
fun change()
}
实现类:
package dynamic.jdk
class TestDaoImpl : TestDao {
override fun change() {
println("change:TestDaoImpl")
}
}
切面类:
package dynamic.jdk
class MyAspect {
fun check() {
println("check:checking")
}
fun finishCheck() {
println("finishCheck:finishCheck")
}
}
动态代理类:
package dynamic.jdk
import java.lang.reflect.InvocationHandler
import java.lang.reflect.Method
import java.lang.reflect.Proxy
class JdkDynamicProxy() : InvocationHandler {
val myAspect: MyAspect
lateinit var testDao: TestDao
init {
myAspect = MyAspect()
}
fun createProxy(testDao: TestDao): Any {
this.testDao = testDao
val classLoader = testDao.javaClass.classLoader
val interfaceClass = testDao.javaClass.interfaces
return Proxy.newProxyInstance(classLoader, interfaceClass, this)
}
@Throws(Throwable::class)
override fun invoke(proxy: Any?, method: Method?, args: Array<out Any>?): Any? {
myAspect.check()
val any = method?.invoke(testDao,*args.orEmpty())
myAspect.finishCheck()
return any
}
}
关键在于这一段
val any = method?.invoke(testDao,*args.orEmpty())
kotlin的可变参数传入java需要进行星型展开(*),如果展开为空则返回空,合起来就是(*args.orEmpty)