上一篇关于java动态代理的jdk实现中,花了大量篇幅介绍了代理模式和静态代理,最后讲了jdk的动态代理实现,也讲到了jdk动态代理实现的一些约束:只能基于接口实现代理
关于jdk的动态代理实现可以参考:
Java动态代理(jdk)
但是我们实际的编码中,大量的类都没有实现任何接口,如何对这些类进行代理呢?答案是cglib
- cglib简介:
CGLIB(Code Generation Library)是一个开源项目! 是一个强大的,高性能,高质量的Code生成类库,它可以在运行期扩展Java类与实现Java接口 CGLIB底层是基于asm框架去实现字节码的生成
- cglib实现动态代理的步骤:
1、实现MethodInterceptor接口 2、通过Enhancer实现代理类的创建(生成一个继承了客户类的子类
- 范例代码:
实现MethodInterceptor接口的类:
public class Hacker implements MethodInterceptor {
// 创建代理
public Object getProxy(RealSubject subject)
{
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(subject.getClass());
enhancer.setCallback(this);
return enhancer.create();
}
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
System.out.println("before the method is invoked");
// 这里调用的是invokeSuper而不是invoke
methodProxy.invokeSuper(o, objects);
System.out.println("after the method is invoked");
return null;
}
}
测试代码:
public class TestMain {
public static void main(String[] args) {
RealSubject subject = new RealSubject();
Hacker hacker = new Hacker();
RealSubject proxy = (RealSubject) hacker.getProxy(subject);
proxy.play();
}
}
运行结果: