java动态代理

java动态代理

java代理是一种设计模式,即通过代理对象访问目标对象,可以在目标对象的基础上增加额外的功能
java代理分为静态代理和动态代理

静态代理:

静态代理在使用时需要定义接口或者父类,被代理对象与代理对象实现相同的接口或者继承相同的父类

聚合的方式实现静态代理

聚合:一个类中调用另一个类的对象
创建一个车站的类,写入方法
声明一个接口
创建一个代理类,可以在代理类中增加或删除功能

编写测试类查看结果

继承的方式实现静态代理

新建一个consignment2类,继承station类,直接使用父类的方法
然后在修改一下测试类
注解:
继承:java中通过extends来创建一个类的子类,一个子类只能继承一个父类
接口:java中通过implements声明自己使用的接口,implements可以实现多个接口

动态代理

在程序运行中动态产生代理,以实现对不同类,不同方法的代理

JDK动态代理

创建一个实现接口InvocationHandler的类,必须实现invoke方法
创建被代理的类以及接口
调用Proxy的静态方法,创建一个代理类,通过代理调用方法
InvocationHandler h = new dynamic(station2);    创建实例,调用处理程序
Class<?>cls = station2.getClass();    这个是代理类实现的接口列表
Proxy.newProxyInstance    实现代理类的classloader
JDK动态代理只能代理实现了接口的类,没有实现接口的类不能实现JDK动态代理

CGLIB动态代理

针对类来实现代理,对目标类产生一个子类,通过方法拦截所有父类方法的调用,大概流程如下

使用IDEA添加cglib的依赖,点击文件然后项目结构
选择Modules,然后点击加号,导入下载好的cglib.jar包。
然后新建一个真实类,我们还用之前创建的station类即可
然后写一个方法拦截器intercept类,调用MethodInterceptor接口方法拦截
写一个测试类
运行一下发现报错了
网上查了一下是因为项目不是maven管理的,无法解决依赖传递问题,需要自己手动引入asm.jar文件,然后在运行一下就可以了












原文地址:https://www.cnblogs.com/Excellent-person/p/14305064.html