一:首先需要明确的是动态代理中,InvocationHandler实现类并不是代理类,只是代理类与被代理类的一个中间类,该类只是用来做功能增强的,这也是动态代理能够解耦的原因
二:动态代理中的代理类是通过Proxy.newInstance方法,即反射生成代理类实例的,该代理类中有一个与被代理方法同名的成员方法,而该成员方法的实现实际就是调用了InvocationHandler实现类的invoke方法,即通过代理类实例调用该成员方法实际调用的是InvocationHandler实现类的invoke方法。而InvocationHandler实现类中的invoke方法就是用来做功能增强的。进而完成了方法的动态代理。
//实现InvocationHandler接口,完成功能的增强
public Class ProxyA implements InvocationHandler{
@Override
public Object invoke(Object proxy,Method method,Object[] args){
//逻辑增强实现
//执行被代理方法
method.invoke()
}
//生成代理类。在InvocationHandler实现类的构造函数当中创建代理类实例,该代理类实例会自动生成一个
//与被代理方法同名的方法,在该方法中实际会调用实现类的invoke()方法
public ProxyA(){
return Proxy.newProxyInstance(相应参数)
}
}
//调用
public Test{
//通过中间类ProxyA动态创建出代理类(实际调用的是Proxy.newProxyInstance())
public static void main(Stirng args[]){}
T proxy = new ProxyA()
proxy.xxx()
}
三:另外,静态代理与动态代理的区别之一也体现在这里。静态代理与动态代理的不同之一就是代理类的创建方法不同,前者是直接手动生成的,后者则是通过反射,运行时动态生成的(代理模式的基本逻辑是一样的)
四:静态代理与动态代理的区别详细说明
静态代理会把代理类与被代理类一一绑定,代理类需要持有被代理类的对象引用,即使要再增加一个一模一样的功能时,依然要再创建出一个代理类来对该功能进行增强,也就是所谓的代理一百个类,就要创建一百个代理类
而动态代理,由于使用的是反射技术,代理类是不需要持有被代理类的对象的(实质代理类都不是自己手动创建的),运行时生成的代理类通过InvocationHandler实现类,进而拿到需要被代理的方法。如果增强同一接口的不同实现类,但是增强的功能是一样的话,jdk动态代根本不需要改动任何代码,即可完成功能的增强。只要InvocationHandler依赖的是被代理的接口即可。当然静态代理一样可以通过依赖接口来进行解耦,但是动态代理与静态代理的核心区别是代理类与被代理类是否直接依赖,当要给接口的不同方法增强相同的功能时,静态代理模式依然是要改动代理类的。
最后:附上后端技术交流圈,欢迎各位大佬入圈交流.......(先添加好友后拉群,添加好友时请备注:小白不黑)