【概述】

  已知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();
}
}

【运行结果】

最新文章

  1. android raw和assets的区别
  2. instanceof 与isAssignableFrom
  3. 省选模拟赛 project
  4. 使用ASP.NET Web Api构建基于REST风格的服务实战系列教程【八】——Web Api的安全性
  5. vue学习笔记之v-if
  6. java 多线程—— 线程让步
  7. Java从零开始学四十三(DOM4j解析XML)
  8. [Java] final的意义
  9. 模拟DOMContentLoaded事件
  10. c语言:union,大小端
  11. Use PRODUCT_USER_PROFILE To Limit User
  12. C语言结构体1.1
  13. chrome浏览器下JavaScript实现clipboard时无法访问剪切板解决方案
  14. Android重复依赖解决办法
  15. mariadb-5.5安装
  16. Java容器解析系列(1) 迭代的进化——从Enumeration到Iterator
  17. 如何搭建http服务仓库
  18. Unity 3D中 Ulua-UGUI简单的Demo——热更新的具体流程、使用说明
  19. iOS 多Target, Other link Flag
  20. PostMan测试接口,绕过登录验证

热门文章

  1. HDU - 4291 循环节
  2. C++ GUI Qt4 编程 (第二版)
  3. Oracle之UTL_FILE 包用法详解
  4. maven项目在eclipse中debug时看不到源码?
  5. Android 通过网络获取图片的源码
  6. date +%F时间日期
  7. Win10磁盘利用率高达100%设置修改方法
  8. 在ASP.NET Core Web API 项目里无法访问(wwwroot)下的文件
  9. python3初探
  10. (转)裸奔的后果!一次ssh被篡改的入侵事件