JAVA反射与代理
2019-05-20 本文已影响0人
huapro
JDK动态代理UML图
image.png
CGLIB动态代理UML
每一个动态代理类都必须要实现InvocationHandler这个接口,并且每个代理类的实例都关联到了一个handler,当我们通过代理对象调用一个方法的时候,这个方法的调用就会被转发为由InvocationHandler这个接口的 invoke 方法来进行调用。我们来看看InvocationHandler这个接口的唯一一个方法 invoke 方法:
image.png动态代理生成的代理对象,最终都可以用接口接收,和目标对象一起形成了多态,可以随意切换展示不同的功能。但是切换的同时,只能使用该接口定义的方法。
image.png image.png- 一个被代理实现类的接口 + InvocationHandler 接口 ===共同初始化Proxy类对象
- Proxy对象实例在调用被代理对象接口函数时候先调用实现了InvocationHandler接口的动态代理对象实例的invoke方法,
- 然后根据动态代理对象实例初始化时入参(被代理对象实例)进一步给method.invoke()函数入参,
- 根据method.invoke入参情况进而决定下一步是否回到被代理类对象实例的真实函数调用(在这一步之前之后可以进行其他操作,实现了增强效果)
InvocationHandler增强器,Proxy代理者,proxy通过class.classLoader 和class.interface ,InvocationHandler来得到一个代理对象
每一个动态代理类的调用处理程序都必须实现InvocationHandler接口,并且每个代理类的实例都关联到了实现该接口的动态代理类调用处理程序中,当我们通过动态代理对象调用一个方法时候,这个方法的调用就会被转发到实现InvocationHandler接口类的invoke方法来调用,看如下invoke方法:
image.png