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在动态代理类的一个完整封装框架。

最新文章

  1. poj1698--最大流(Dinic)
  2. git与github安装、配置、pull、push
  3. 在CSS中定义a:link、a:visited、a:hover、a:active顺序
  4. oracle创建表相关
  5. magento中如何实现产品图片放大效果
  6. 阻塞队列--LinkedBlockingQueue
  7. Android 发布可穿戴设备 SDK 的开发者预览版
  8. 使用Android SDK Manager自动下载速度慢解决方法
  9. Gson JsonParser的使用
  10. HttpClient基础教程
  11. Oracle EBS-SQL (CST-4):检查组织间项目成本.sql
  12. 【JAVA零基础入门系列】Day9 Java中的那个大数值
  13. C#设计模式整理
  14. SpringMVC源码解读 - HandlerMapping - RequestMappingHandlerMapping请求分发
  15. Selenium2+python自动化38-显式等待(WebDriverWait)
  16. 3.div+css 的布局较 table 布局有什么优点
  17. 腾讯、百度、网易游戏、华为Offer及笔经面经
  18. 2019第1周日-MQ选型要点
  19. mysql 8.0 初识
  20. Live2D 博客页面添加板娘

热门文章

  1. [原题复现+审计][BJDCTF2020]Mark loves cat($$导致的变量覆盖问题)
  2. phpmyadmin反序列化漏洞(WooYun-2016-199433)
  3. 一文带你读懂!华为云在ACMUG技术沙龙上都透露了些啥?
  4. 详细了解IDM的队列功能
  5. ABBYY FineReader 15 PDF文档编辑功能详解
  6. RabbitMQ PHP扩展安装
  7. C语言讲义——冒泡排序(bubble sort)
  8. Java基础教程——System类
  9. transform的2D和3D变换
  10. 转:Python考核试题及答案