java动态代理
java动态代理
java代理是一种设计模式,即通过代理对象访问目标对象,可以在目标对象的基础上增加额外的功能
java代理分为静态代理和动态代理
静态代理:
静态代理在使用时需要定义接口或者父类,被代理对象与代理对象实现相同的接口或者继承相同的父类
聚合的方式实现静态代理
聚合:一个类中调用另一个类的对象
创建一个车站的类,写入方法
新建一个consignment2类,继承station类,直接使用父类的方法
然后在修改一下测试类
注解:
继承:java中通过extends来创建一个类的子类,一个子类只能继承一个父类
接口:java中通过implements声明自己使用的接口,implements可以实现多个接口
动态代理
在程序运行中动态产生代理,以实现对不同类,不同方法的代理
JDK动态代理
创建一个实现接口InvocationHandler的类,必须实现invoke方法
InvocationHandler h = new dynamic(station2); 创建实例,调用处理程序
Class<?>cls = station2.getClass(); 这个是代理类实现的接口列表
Proxy.newProxyInstance 实现代理类的classloader
JDK动态代理只能代理实现了接口的类,没有实现接口的类不能实现JDK动态代理
CGLIB动态代理
针对类来实现代理,对目标类产生一个子类,通过方法拦截所有父类方法的调用,大概流程如下
![](https://img2020.cnblogs.com/blog/1281664/202101/1281664-20210120210931194-857364944.png)
使用IDEA添加cglib的依赖,点击文件然后项目结构
网上查了一下是因为项目不是maven管理的,无法解决依赖传递问题,需要自己手动引入asm.jar文件,然后在运行一下就可以了