什么是动态代理:
要想知道什么是动态代理需要了解什么是静态代理,知道了静态代理后,动态代理就是在代码运行的过程中,生成了静态代理的代码。
动态代理的实现:
一般有两种方式来实现。java原生api提供支持,以及第三方的库,例如cglib。
-
java api
java中可以通过Proxy类来生成动态代理实现,并通过InvocationHanlder来实现方法的拦截,缺点是,只能对接口实现动态代理,无法对非接口来实现动态代理 -
cglib
本文主要讲解cglib的使用:
public class SampleClass {
public String test() {
return "123";
}
public static void main(String[] args) {
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(SampleClass.class);
enhancer.setCallback(new MethodInterceptor() {
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
System.out.println("before method run");
Object result = methodProxy.invokeSuper(o, objects);
System.out.println("after method run");
return result;
}
});
SampleClass sampleClass = (SampleClass) enhancer.create();
sampleClass.test();
}
cglib是采用asm库在底层来操作字节码来实现动态代理的。
Proxy为什么不能对非接口实现动态代理:
因为生成的动态代理类需要继承Proxy类,java是没有多继承的,所以不能对非接口实现动态代理