美文网首页
动态代理机制InvocationHandler(kotlin)

动态代理机制InvocationHandler(kotlin)

作者: 半罐子晃 | 来源:发表于2021-09-06 16:00 被阅读0次

动态代理是JVM在运行期创建class字节码并加载的过程
动态代理机制(Dynamic Proxy):可以在运行期动态创建某个interface的实例

创建A接口,但不创建实现类,直接通过JDK提供的Proxy。newProxyInstance()创建一个A接口对象。这种没有实现类但是在运行期动态创建了一个接口对象的方式称作动态代理。

代码实现:

//定义接口
interface StudentInterface {

    fun name(name : String)

    fun age(age : Int)

}
//实现
private fun proxyTest() {
        //通过InvocationHandler 接口中的 invoke 方法进行业务的调用和增强等处理,InvocationHandler是一个拦截器类
        val handler = InvocationHandler { proxy, method, args ->
            if (method.name == "name") {
                Log.i(TAG, "invoke: " + args[0])
            }
            null
        }
  
        //通过Proxy.nexProxyInstance()创建对应的实例对象
        val student: StudentInterface = Proxy.newProxyInstance(
            StudentInterface::class.java.classLoader,
            arrayOf(StudentInterface::class.java),
            handler
        ) as StudentInterface
        student.name("chou")
    }

代码封装后:

class StudentProxy(private val objStudent: Any) : InvocationHandler {

    fun getProxyInstance(): Any = Proxy.newProxyInstance(
        objStudent::class.java.classLoader,
        objStudent::class.java.interfaces,
        this
    )

    override fun invoke(proxy: Any?, method: Method?, args: Array<Any?>): Any?{
        if (method?.name == "name") {
            //拦截处理增强业务
            Log.i(MainActivity.TAG, "StudentProxy invoke: " + (args[0] ?: "null"))

        }
        //调用自身
        return method?.invoke(objStudent, *args)
    }
}


        //调用
        val university = UniversityStudent()
        val studentProxy = StudentProxy(university)
        val universityStudent : StudentInterface = studentProxy.getProxyInstance() as StudentInterface
        universityStudent.name("bigeye")

静态代理与动态代理区别:静态代理 创建代理类,实现对应的接口并通过构造传入需要被代理的实例,实现接口里的方法,处理需要增强的业务并在相应方法中调用被代理类的方法。

相关文章

  • 动态代理机制InvocationHandler(kotlin)

    动态代理是JVM在运行期创建class字节码并加载的过程动态代理机制(Dynamic Proxy):可以在运行期动...

  • Java高级动态原理

    动态代理的简要说明 在java的动态代理机制中,有两个重要的类或接口,一个是 InvocationHandler(...

  • 动态代理

    Jdk 动态代理 Jdk动态代理,利用反射,实现 InvocationHandler 接口。Jdk 动态代理需要实...

  • java 动态代理

    1、代理模式 2、java 动态代理2.1 InvocationHandler 实现类告诉程序运行动态生成的代理...

  • Mybatis动态代理

    Mybatis动态代理 实现 MapperProxy实现InvocationHandler接口,重写...

  • java 的动态代理机制

    在java 的动态代理机制中,有两个重要的类或者接口,一个是InvocationHandler(interface...

  • Java动态代理 CGLib 与 JDK Proxy

    JDK动态代理 动态代理区别于静态代理,代理类在运行时生成。JDK 提供InvocationHandler接口和P...

  • 代理模式

    1、JDK动态代理: JDK动态代理是实现InvocationHandler接口,然后利用反射新建一个原始类的代理...

  • Java动态代理InvocationHandler和Proxy学

    java动态代理机制中有两个重要的类和接口InvocationHandler(接口)和Proxy(类),这一个类P...

  • java jdk动态代理简单使用

    java动态代理机制中有两个重要的类和接口InvocationHandler(接口)和Proxy(类),这一个类P...

网友评论

      本文标题:动态代理机制InvocationHandler(kotlin)

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