使用泛型简化动态代理
来源:互联网 发布:小蜜蜂软件 编辑:程序博客网 时间:2024/05/17 11:56
说明
- 本文适合对动态代理有最最基本了解的人,可参看AOP的底层实现-CGLIB动态代理和JDK动态代理。
- 本文目的在于简化动态代理的调用
maven依赖
<dependency> <groupId>cglib</groupId> <artifactId>cglib</artifactId> <version>3.2.5</version> </dependency>
类图
代码
Shape
public interface Shape { void draw();}
Circle
public class Circle implements Shape{ @Override public void draw() { System.out.println("我是一个圆~"); }}
Square
public class Square implements Shape{ @Override public void draw() { System.out.println("我是一个四方形~"); }}
DynamicProxy
public interface DynamicProxy<T> { T bind();}
JDKDynamicProxy
public class JDKDynamicProxy<T> implements DynamicProxy<T>, InvocationHandler { public JDKDynamicProxy(T t) { this.t = t; } private T t; @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("method " + method.getName() + " begin"); method.invoke(t, args); System.out.println("method " + method.getName() + " end"); return null; } @Override public T bind() { return (T) Proxy.newProxyInstance(t.getClass().getClassLoader(), t.getClass().getInterfaces(), this); }}
CGLibDynamicProxy
public class CGLibDynamicProxy<T> implements DynamicProxy<T>, MethodInterceptor { private T t; public CGLibDynamicProxy(T t) { this.t = t; } public T bind() { Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(t.getClass()); enhancer.setCallback(this); T t = (T) enhancer.create(); return t; } @Override public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable { System.out.println("method " + method.getName() + " begin");// methodProxy.invokeSuper(o, objects); method.invoke(t,objects); System.out.println("method " + method.getName() + " end"); return null; }}
Demo
public class Demo { public static void main(String[] args) { Shape shape = new Circle(); CGLibDynamicProxy<Shape> cgLibDynamicProxy = new CGLibDynamicProxy<>(shape); cgLibDynamicProxy.bind().draw(); shape = new Square(); JDKDynamicProxy<Shape> jdkDynamicProxy = new JDKDynamicProxy<>(shape); jdkDynamicProxy.bind().draw(); }}
运行结果
注意
cglib中使用methodProxy和method可以达到同样的效果,但是所调参数不一样,否则会报错,具体原因无意深究,会用即可。
阅读全文
0 0
- 使用泛型简化动态代理
- 使用通配符简化泛型使用
- 使用通配符简化泛型使用
- 使用通配符简化泛型使用
- java使用通配符简化泛型使用
- 使用动态代理,提高工作效率
- Spring动态代理使用
- 为何使用动态代理
- 动态代理使用
- 动态代理的使用
- Java动态代理使用
- 使用 JDK 动态代理
- 使用AspectCore动态代理
- cglib动态代理使用
- java动态代理使用
- 使用Mybatis动态sql简化开发
- 使用泛型程序简化代码设计
- castle动态代理的使用
- 打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数本身。例如:153 是一个"水仙花数",因为153=1的三次方+5的三次方+3的三次方。
- UVA 572 Oil Deposits(DFS)
- 「NOIP2017模拟赛09.07」虐场
- 二进制逻辑运算求解137. Single Number II
- JD2018校招神奇数,疯狂队列
- 使用泛型简化动态代理
- 条件传送指令
- Mac 配置 php-fpm 时出现'/private/etc/php-fpm.conf': No such file or directory (2)
- minScale、maxScale与visible的区别
- Java设计模式之普通工厂模式
- sql注入原理2
- 求1+2!+3!+...+20!的和
- H5---基础知识介绍
- 基于矢量切片的电子地图配图(三)配图准备