动态代理
Posted bowenqianngzhibushiwo
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了动态代理相关的知识,希望对你有一定的参考价值。
动态代理包括jdk动态代理和CGLIB动态代理
其中jdk动态代理是通过对象本身实现接口,而代理对象不实现接口来实现
在Spring中实现AOP即面向切面的编程的时候,需要用到动态代理,
当代理的类是基于接口实现的时候Spring会使用jdk动态代理,但是当时基于继承实现代理的时候Spring自动切换为CGLIB动态代理。
java代理机制中最重要的是一个InvocationHandler接口和Proxy类,这两个是实现动态代理不可或缺的。
invocationHandler 中有一个唯一的方法invoke()
Object invoke(Object proxy,,Method method,Object[] args ) thros throwable
proxy:所被代理的真实对象
method:所要调用的真实对象的某个方法的Method
args: 调用真实对象的某个方法时接收的参数
proxy类中的中最常用的方法就是 newproxyinstance()方法
public static Obejct newProxyInstance(ClassLoader losder,Class<?>[] interface,InvocatinHandler h)throws illega;ArgumentException{};
loader :一个classloader对象定义了由哪个classloader对象来对生成的代理对象进行加载
interfaces:一个interface对象的数组,是给需要被代理的对象提供的一组接口,这个代理对象就宣称可以实现这些接口实现多态
h: 一个InvocationHandler对象,表示的是当我这个动态代理对象在调用方法的时候,会关联到哪一个InvocationHandler对象上
代码实现
//interface public interface A{ public void a(); public void aa(String str); } //realsubbject public class Realsubbject implements A{ @Overrider public void a(){} @Override public void aa(String str){} } //proxy代理类 public class jdkproxy implements invocationhandler { //subjext private Object subObject; public jdkprocy(Object subObject){this.subObject=subObject;} @Overrider public Object invokeObject proxy,Mehtod method,Onject<?>[] args)thorows throwable{ //before ... method.invoke(subject,args);//代理调用方法的使用总是会自动跳转到 //相关的handler对象的invoke方法。 //after ... return null; } } //实现类 public class Imp{ A subObject=new Realsubject(); InvacotionHandler handler=new jdkobject(sunObject);//把需要代 //理的对象,通过该对象来调用方法 A subObject=(A)Proxy.newProxyInstance(h.getclass().getclassloader(),realObject.getclass().getinterface(),h); System.out.println(subObject.getClass().getName()); }
reference:https://blog.csdn.net/weixin_34362991/article/details/85589143
以上是关于动态代理的主要内容,如果未能解决你的问题,请参考以下文章