思想无语言边界:以 cglib 介绍 AOP 在 java 的一个实现方式
2020-12-16 20:20
1276 查看
0. 前言
上接:基于 Source Generators 做个 AOP 静态编织小实验
作为第三篇,我们基于cglib在java做一个简单的aop例子, 以此简单作为例子说一个思路在什么样的语言里面都是共同的,这是骨,不要纠结什么语言什么实现,这只是皮。
同以前一样,是个人随笔,不是新手教学,不会教会别人怎么使用cglib,只会给出官方文档,请自学成才。
内容安排如下:
- cglib demo
- 简单介绍cglib原理
1. cglib demo
1.0 cglib 是什么?
https://github.com/cglib/cglib/wiki 官方介绍地址
cglib 全名 Code Generation Library, 是个动态代理代码生成库,用来在运行时 extend JAVA classes and implements interfaces。
1.1 demo
1.1.1 使用 cglib 创建代理类
public static Object createProxy(Class clazz, MethodInterceptor interceptor) { try { Enhancer e = new Enhancer(); e.setSuperclass(clazz); e.setCallback(interceptor); Object bean = e.create(); return bean; } catch (Throwable e) { e.printStackTrace(); throw new Error(e.getMessage()); } }
1.1.2 实现AddOneInterceptor
import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.proxy.MethodProxy; import java.lang.reflect.Method; public class AddOneInterceptor implements MethodInterceptor { public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable { if(method.getReturnType() == int.class) { return ((Integer) methodProxy.invokeSuper(o, objects)) + 1; } else { return methodProxy.invokeSuper(o, objects); } } }
1.1.3 测试
public class RealClass { public int Add(int i, int j) { return i + j; } } public static void main(String args[]) { RealClass proxy = (RealClass) createProxy(RealClass.class, new AddOneInterceptor()); int i = 5; int j = 10; System.out.println(String.format("%s + %s = %s, but proxy is %s", i, j, i + j, proxy.Add(i, j))); }
结果:
5 + 10 = 15, but proxy is 16
2. 简单介绍cglib原理
原理一句话:动态生成一个类的子类作为代理类,在子类中扩展想要加入的功能。
底层基于ASM 一个字节码处理框架。
ASM 是一个 Java 字节码操控框架。它能被用来动态生成类或者增强既有类的功能。ASM 可以直接产生二进制 class 文件,也可以在类被加载入 Java 虚拟机之前动态改变类行为。Java class 被存储在严格格式定义的 .class 文件里,这些类文件拥有足够的元数据来解析类中的所有元素:类名称、方法、属性以及 Java 字节码(指令)。ASM 从类文件中读入信息后,能够改变类行为,分析类信息,甚至能够根据用户要求生成新类。
可以看 https://developer.ibm.com/zh/articles/j-lo-asm30/ 这篇文章完整了解ASM。
可以说 cglib 就是ASM在动态代理类的一个完整封装框架。
相关文章推荐
- Java中实现AOP的两种方式 之二:使用CGLIB开源框架实现
- Java中实现AOP的两种方式 之二:使用CGLIB开源框架实现
- 动态语言和虚拟机实现, 暨介绍一下我设计的一个新型的动态语言(1)
- Java语言规范要求equals方法具有的特性以及实现方式
- Spring中AOP的两种代理方式(Java动态代理和CGLIB代理)
- 动态语言和虚拟机实现, 暨介绍一下我设计的一个新型的动态语言(3)
- java SpringAOP拦截Controller,Service实现日志管理(自定义注解的方式)
- JAVA动态代理和方法拦截(使用CGLib实现AOP、方法拦截、委托)
- 用java实现一个单线程基于控制台和以文件为数据存储并加上一点MVC思想的ATM
- Spring中AOP的两种代理方式(Java动态代理和CGLIB代理)
- 实现动态代理的两种方式介绍+例子demo(JDK、CGlib)
- Spring中AOP的两种代理方式(Java动态代理和CGLIB代理)
- java SpringAOP拦截Controller,Service实现日志管理(自定义注解的方式)
- 推荐一个关于AOP的AOP@WORK的专栏作者的AOP专题系列文章,主要关于Java下的AOP实现,毕竟Java下的AOP实现确实要比.Net下成熟得多,共12篇
- JAVA实现一个简单的代数运算语言编译器(三)--词法分析
- java实现快速排序的分割思想:在快速排序算法中,我们随机在数组中选择一个数字,然后把比选中数字小的数字都排在它前面,比选中数字大的数字都排在它的后面。
- 《Java》-------用AOP思想实现JDBC事物的管理
- 一个简易的流水账号实现方式(java)
- Base64编码介绍及基于Java语言实现
- 对一个数组进行螺旋式打印,java语言实现