美文网首页
kotlin实现动态代理出现的问题

kotlin实现动态代理出现的问题

作者: 九科门人 | 来源:发表于2019-03-19 10:40 被阅读0次

首先创建一个目标类

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
        }
    }
}

相关文章

网友评论

      本文标题:kotlin实现动态代理出现的问题

      本文链接:https://www.haomeiwen.com/subject/etawmqtx.html