Java与代理——cglib基本使用

cglib与asm简介

ASM 是能够生成Java字节码的一个开源框架。其能够修改已有类或者动态生成类,其操作结果为产生Java字节码文件,同时可以修改Java字节码文件。
cglib 底层运用了ASM这一字节码操纵框架,其主要作用是通过继承的方式实现动态代理。利用cglib实现动态代理,相比于JDK原生动态代理来说,避免了必须实现接口的要求。但是cglib也不是万能的,由于其需要通过继承方式完成动态代理,所以其无法对 final 关键字修饰的类进行代理增强。

cglib的入门使用

了解了cglib的基本概念,我们来看一个简单利用cglib实现方法增强的例子。
该工程使用maven进行依赖管理,在编写之前需加入cglib的maven依赖,pom文件中添加:

1
2
3
4
5
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>3.2.5</version>
</dependency>

实例代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
要被代理的类的声明如下:
public class Producer {
/**
* 被代理类方法,原本业务逻辑实现
*/
public void sale() {
System.out.println("生产者:我卖出了一个作品");
}
}
代理的声明如下:
public class SuperMarket implements MethodInterceptor {
/**
* 重写实现增强的方法
* @param o
* @param method,
* @param objects,
* @param methodProxy,
* @return
* @throws Throwable
*/
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
//前置增强
System.out.println("代理商场:卖出货物");
//调用需要被代理的方法
methodProxy.invokeSuper(o, objects);
//后置增强
System.out.println("后置增强实例");
return null;
}
}
主类(测试类)声明如下:
public class Buyer {
public static void main(String[] args) {
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(Producer.class);
enhancer.setCallback(new SuperMarket());
Producer producer = (Producer) enhancer.create();
producer.sale();
}
}
Output:
代理商场:卖出货物
生产者:我卖出了一个作品
后置增强实例

此例展示了一个最基本的利用cglib字节码生成库进行方法增强的示例,下面我们来进行代码的分析。