首先创建一个目标类
interface IUserService {
fun addUser()
fun updateUser()
fun deleteUser()
}
class UserServiceImpl:IUserService {
override fun addUser() {
System.out.println("add user")
}
override fun updateUser() {
System.out.println("update user")
}
override fun deleteUser() {
System.out.println("delete user")
}
}
创建切面类
class Apsect {
fun before() {
System.out.println("before")
}
fun after() {
System.out.println("after")
}
}
创建工厂类
class BeanFactory {
companion object {
fun createUserService(): IUserService {
val userService: IUserService = UserServiceImpl()
val aspect: Apsect = Apsect()
return Proxy.newProxyInstance(
this::class.java.classLoader,
userService.javaClass.interfaces,
object : InvocationHandler {
//这里要注意的是在ide自动生成的invoke方法中,返回值是Any,由于obj可能为空,所以要手动添加?
override fun invoke(proxy: Any?, method: Method?, args: Array<out Any>?): Any? {
aspect.before()
// 因为invoke接受的第二个参数是可变参数,而传来的args是array,所以就需要*操作符将array变成可变的参数。
val obj = method!!.invoke(userService, *args.orEmpty())
aspect.after()
return obj
}
})as IUserService
}
}
}