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

思想无语言边界:以 cglib 介绍 AOP 在 java 的一个实现方式的更多相关文章

  1. Spring进阶之路(10)-Advice简单介绍以及通过cglib生成AOP代理对象

    Advice简单介绍 1. Before:在目标方法运行之前运行织入.假设Before的处理中没有进行特殊的处理.那么目标方法终于会运行,可是假设想要阻止目标方法运行时.能够通过抛出一个异常来实现.B ...

  2. CGLIB介绍与原理

    转载: http://blog.csdn.net/zghwaicsdn/article/details/50957474 CGLIB介绍与原理(部分节选自网络) 一.什么是CGLIB? CGLIB是一 ...

  3. 【开源】简单4步搞定QQ登录,无需什么代码功底【无语言界限】

    说17号发超简单的教程就17号,qq核审通过后就封装了这个,现在放出来~~ 这个是我封装的一个开源项目:https://github.com/dunitian/LoTQQLogin ————————— ...

  4. 【转】TCP协议的无消息边界问题

    http://www.cnblogs.com/eping/archive/2009/12/12/1622579.html   使用TCP协议编写应用程序时,需要考虑一个问题:TCP协议是无消息边界的, ...

  5. Go语言Web框架gwk介绍4

    Go语言Web框架gwk介绍 (四)   事件 gwk支持事件系统,但并没有硬编码有哪些事件,而是采用了比较松散的定义方式. 订阅事件有两种方式: 调用On函数或者OnFunc函数 func On(m ...

  6. Go语言Web框架gwk介绍 3

    Go语言Web框架gwk介绍 (三)   上一篇忘了ChanResult ChanResult 可以用来模拟BigPipe,定义如下 type ChanResult struct { Wait syn ...

  7. Go语言Web框架gwk介绍2

    Go语言Web框架gwk介绍 (二) HttpResult 凡是实现了HttpResult接口的对象,都可以作为gwk返回Web客户端的内容.HttpResult接口定义非常简单,只有一个方法: ty ...

  8. Go语言Web框架gwk介绍 1

    Go语言Web框架gwk介绍 (一)   今天看到Golang排名到前30名了,看来关注的人越来越多了,接下来几天详细介绍Golang一个web开发框架GWK. 现在博客园支持markdown格式发布 ...

  9. 利用Cglib实现AOP

    前文讲了, 可以利用Spring, Guice等框架提供的容器实现AOP, 如果想绕过容器, 直接注入Class, 可以利用Cglib为对象加上动态代理,实现代码切入, 但是每次调用比较繁琐, 因此我 ...

随机推荐

  1. Android RFID调试总结

    调试了包括驱动,jni层,当然也熟悉了下应用层.    1. 驱动层包括修改:        device/eastaeon/aeon6735_65c_l/init.project.rc    //去 ...

  2. Camtasia中对录制视频进行编辑——音效

    市场上有很多的视频处理软件,形形色色的软件往往会使人眼花缭乱,而对于那些短视频的制作者来说,拥有一款好的视频处理软件会让自己的视频收获更多的点赞.那么今天我便给大家推荐一款同时具有录屏和编辑视频功能的 ...

  3. FL Studio进行侧链的三种方式(下)

    在上篇教程中我们了解了在FL Studio中进行侧链的第一种方式,今天我们就来继续带领大家了解进行侧链的另外两种方式. 如何使用 Fruity Peak Controller(果味峰值控制器)在FL ...

  4. Folx专业版任务计划功能详解

    Folx专业版的任务计划功能允许用户以时间表的方式,制定下载计划.按照预先设定的时间计划,Folx会在指定的时间段内,自动开启或停止下载任务. 另外,用户还可以设置自动关机功能.当计划下载任务停止时, ...

  5. guitar pro系列教程(二十一):Guitar Pro在乐谱上的工作【一】

    当我们使用Guitar Pro写好一首乐谱之后,通常在乐谱上还会有哪些操作呢?对于刚接触{cms_selflink page='index' text='Guitar Pro'}的朋友们肯定还是不熟悉 ...

  6. @Async失效之谜

    @Async如何使用 异步的方法上加上@Async异步注解 启动类中需要加上@EnableAsync才有效 使用时类似于下列函数: new Thread(()-> System.out.prin ...

  7. CentOS7配置时间和CentOS6搭建局域网NTP

    NTP 2015年8月20日 星期四 17:34 CentOS 7配置本地时区和TIME ZONE #用tzselect配置时区和time zone [root@localhost Asia]# /u ...

  8. Android的Toolbar(含溢出菜单设置[弹出菜单的使用])的使用PopMenu的样式

    http://blog.csdn.net/yingtian648/article/details/52432438(转载) 1.在Toolbar.xml中设置弹出菜单的风格(app:popupThem ...

  9. ansible playbook 安装docker

    1.新增host配置到/etc/ansible/hosts文件中 [docker] 192.168.43.95 2.配置无密码登录 # 配置ssh,默认rsa加密,保存目录(公钥)~/.ssh/id_ ...

  10. PyQt(Python+Qt)学习随笔:QTabWidget部件信号简介

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 QTabWidget自身提供的信号包括如下: currentChanged(int index):每 ...