博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
cglib代理与jdk动态代理示例
阅读量:5015 次
发布时间:2019-06-12

本文共 2582 字,大约阅读时间需要 8 分钟。

先看基于jdk实现的动态代理实现例子

1、先声明一个接口类

1 public interface UserService{2   3     public String getName(String msg);    4 }

2、实现上面定义的接口类

1 public class UserServiceImpl implements UserService {2 3       @Override4       public String getName(String msg) {5              System.out.println("###enter getName method###");6              return msg;7       }8 }

3、实现InvocationHandler接口类

1 import java.lang.reflect.Method; 2 import java.lang.reflect.InvocationHandler; 3  4 public class MyInvocationHandler implements InvocationHandler { 5  6       private Object targetObj; 7       8       public MyInvocationHandler(){} 9 10       public MyInvocationHandler(Object obj) {11   12              this.targetObj = obj;    13       }14 15       @Override16       public Object invoke(Object proxy, Method method, Object[] args)     17       throws  Throwable {18 19                 System.out.println("###enter invoke method pre###");20                 Object result = method.invoke(targetObj, args);21                 System.out.println("###enter invoke method after###");22                 return result;23       }24 }

4、测试类

1 public class JdkProxyMain{ 2    3     public static void main(String[] args) { 4  5            UserService service = new UserServiceImpl(); 6            InvocationHandler invoke = new MyInvocationHandler(); 7  8            UserService proxy = (UserService)Proxy.newProxyInstance(service.getClass().getClassLoader(), service.getClass().getInterfaces(), invoke); 9            proxy.getName();10     }11 }

 

Cglib动态代理示例(还是基于上面的接口类及实现接口类,cglib也支持类的实现方式来支持动态代理,需引入cglib jar包)

1 public class CglibProxy implements MethodInterceptor {2 3       @Override4       public Object intercept(Object target, Method method, Object[] params,  MethodProxy methodProxy) throws Throwable {
System.out.println("....enter invoke pre..."); methodProxy.invokeSuper(target, params); System.out.println("...enter invoke end...");5 return null; 6 }7 }
1 public class CglibMain{ 2  3     public static void main(String[] args) { 4             System.setProperty(DebuggingClassWriter.DEBUG_LOCATION_PROPERTY, "F:\\code");//设置生成代理类的路径 5             CglibProxy cglib = new CglibProxy(); 6             Enhancer enhancer = new Enhancer(); 7             enhancer.setSuperclass(UserServiceImpl.class); 8             enhancer.setCallback(cglib); 9 10             UserService service = (UserService)enhancer.create();11             String result service.getName("cglib");12     }13 14 }

 

转载于:https://www.cnblogs.com/codechange/p/8650620.html

你可能感兴趣的文章
Slickflow.NET 开源工作流引擎基础介绍(三) -- 基于HTML5/Bootstrap的Web流程设计器
查看>>
Node教程
查看>>
java将字段映射成另一个字段,关于 接口传参 字段不对应转换
查看>>
Redis
查看>>
字段和属性的区别
查看>>
HTTP(一)工作机制
查看>>
条形码扫描枪数据读取的问题
查看>>
$this->autoRender = false
查看>>
健壮的 Java 基准测试
查看>>
phpstorm查看类的继承关系
查看>>
git create clone(仓库)
查看>>
chmod修改文件权限的命令
查看>>
新博客牵至简书
查看>>
矩阵求逆
查看>>
在 Windows 8、Windows 10 桌面模式下的 .NET Framework 程序中,引用 Windows.Runtime 的 API。...
查看>>
2015 8月24号 工作计划与实行
查看>>
MVC AJAX
查看>>
Google Map API V3开发(6) 代码
查看>>
Kafka初入门简单配置与使用
查看>>
第三章Git使用入门
查看>>