18_CGLib动态代理
2024-08-23 03:13:48
【概述】
已知JDK动态代理中的Proxy.newProxyInstance(ClassLoader loader,Class[] interfaces,InvocationHandler h)方法的第二个参数Class[] interfaces就是需要代理类实例实现的接口列表,即这里的代理类必须实现接口。
CGLib采用非常底层的字节码技术,可以为一个类创建子类,并在子类中采用方法拦截的技术拦截所有父类方法的调用,并顺势织入横切逻辑。采用CGLib可以为任何类创建织入横切代码的代理创建器。
【例子】(注意cglib-2.1.3版本,使用cglib-2.2会出错)
【Monitor.java】
package com.Higgin.demo; /**
* 监测类
*/
public class Monitor {
public static void begin(){
System.out.println("【操作数据库前】开始监测...");
} public static void end(){
System.out.println("【操作数据库后】结束检测,得到检测数据...");
}
}
【PersonDap.java】
package com.Higgin.demo; /**
* 操作数据库的PersonDao类
*/
public class PersonDao {
public void getAllPerson(){
System.out.println("查询数据库得到所有的Person");
} public void deleteAllPerson(){
System.out.println("删除数据库所有的Person");
}
}
【CglibProxy.java】
package com.Higgin.demo; import java.lang.reflect.Method; import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy; public class CglibProxy implements MethodInterceptor{ private Enhancer enhancer=new Enhancer();
public Object getProxy(Class clazz){
enhancer.setSuperclass(clazz);
enhancer.setCallback(this);
return enhancer.create();
} /**
* intercept方法会拦截目标类所有方法的调用
* obj: 目标类的实例
* method: 目标类方法的反射对象
* args: 方法的动态参数
* proxy: 代理类的实例
*/
@Override
public Object intercept(Object obj, Method method, Object[] args,MethodProxy proxy) throws Throwable {
Monitor.begin();
Object result=proxy.invokeSuper(obj, args); //通过代理类调用父类中的方法
Monitor.end();
return result;
} }
【TestPersonDao.java】
package com.Higgin.demo; public class TestPersonDao {
public static void main(String[] args) {
CglibProxy proxy=new CglibProxy(); //可以通过getProxy(Class clazz)为一个目标类Proxy创建动态代理对象
PersonDao personDao=(PersonDao) proxy.getProxy(PersonDao.class); personDao.getAllPerson();
System.out.println("--------------------------------------")
personDao.deleteAllPerson();
}
}
【运行结果】
最新文章
- android raw和assets的区别
- instanceof 与isAssignableFrom
- 省选模拟赛 project
- 使用ASP.NET Web Api构建基于REST风格的服务实战系列教程【八】——Web Api的安全性
- vue学习笔记之v-if
- java 多线程—— 线程让步
- Java从零开始学四十三(DOM4j解析XML)
- [Java] final的意义
- 模拟DOMContentLoaded事件
- c语言:union,大小端
- Use PRODUCT_USER_PROFILE To Limit User
- C语言结构体1.1
- chrome浏览器下JavaScript实现clipboard时无法访问剪切板解决方案
- Android重复依赖解决办法
- mariadb-5.5安装
- Java容器解析系列(1) 迭代的进化——从Enumeration到Iterator
- 如何搭建http服务仓库
- Unity 3D中 Ulua-UGUI简单的Demo——热更新的具体流程、使用说明
- iOS 多Target, Other link Flag
- PostMan测试接口,绕过登录验证