- 动态代理
1.1 有接口的情况
有接口时,使用JDK动态代理。使用Proxy类里面的newProxyInstance创建代理对象。
public class JDKProxy {
public static void main(String[] args) {
//创建接口实现类代理对象
Class[] interfaces = {UserDao.class};
UserDao user = (UserDao)Proxy.newProxyInstance(JDKProxy.class.getClassLoader(), interfaces,
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
return null;
}
});
user.display();
}
}
newProxyInstance方法包含三个参数:
loader:加载真实对象的类加载器(不过也有使用JDKProxy.class.getClassLoader()的,不知为何也能成功);
interfaces:真实对象已经实现了的所有接口组成的数组;
h:实现的InvocationHandler请求处理程序就是写增强方法的代理逻辑。
执行过程:当代理对象(user)调用方法(display)时,会调用代理逻辑中的invoke函数,并把自身作为proxy参数,把代理对象调用的方法作为method参数,代理对象调用方法的参数作为args,一起给传入代理逻辑类AdvertisementLogic中的invoke()方法里作为参数,这样,在invoke()方法里,就能够通过反射调用到真实对象的真实方法(method.invoke(dlrb,args)),并且在调用真实方法前后可以加入一些其他的控制逻辑。
真正实现代理逻辑的是代理逻辑类,当代理对象的方法被调用时,【代理对象】并不直接调用【真实对象】,而是直接调用【代理逻辑类】并传给它需要的参数,由【代理逻辑类】来实现真正的代理逻辑,而【代理逻辑类】不仅可以执行自己的代理逻辑,还可以随时调用【真实对象】的方法,从而完成了整个的代理。因此,热巴小姐姐如果需要【拍电视剧】的话,我们只要在去实现一个【拍电视剧】的【代理逻辑类】就好了,最后把它交给JDK的动态代理方法【Proxy.newProxyInstance()】就好了。
参考博文:
- https://blog.youkuaiyun.com/qq_19782019/article/details/83277344
- 尚硅谷spring5