了解什么是動態(tài)代理模式棺耍,可參考Java設計模式之代理模式
簡介
前面我們了解了JDK動態(tài)代理技術糜颠,發(fā)現(xiàn)其真實對象必須提供接口才可以使用耕拷。在一些不提供接口的環(huán)境中讼昆,只能采用一些別的第三方技術,比如CGLIB動態(tài)代理骚烧。它的有事在于不需要提供接口浸赫,只要一個非抽象類就可以實現(xiàn)動態(tài)代理。
- 實現(xiàn)代理邏輯的類需要實現(xiàn)net.sf.cglib.proxy.MethodInterceptor接口
- 下面示例的具體代碼可到cglib動態(tài)代理中下載赃绊。
- 實驗需要引入CGLIB jar包
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>2.2.2</version>
</dependency>
示例
【真實對象類】
public class HelloGod {
private String name;
public HelloGod(String name){
this.name = name;
}
public void helloGod(){
System.out.println("hello " + name);
}
}
【動態(tài)代理綁定和代理邏輯實現(xiàn)】
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;
public class CglibProxyExample implements MethodInterceptor {
/**
* @param cls Class類
* @return Class的CGLIB代理對象
*/
public Object getProxy(Class cls, Class[] argumentTypes, Object[] arguments){
//CGLIB enhancer增強類對象
Enhancer enhancer = new Enhancer();
//設置增強類型
enhancer.setSuperclass(cls);
//定義代理對象為當前對象既峡,要求當前對象實現(xiàn)MethodInterceptor方法
enhancer.setCallback(this);
//生成并返回代理對象
return enhancer.create(argumentTypes ,arguments);
}
/**
* @param proxy 代理對象
* @param method 方法
* @param args 方法參數(shù)
* @param methodProxy 方法代理
* @return 代理邏輯返回
* @throws Throwable 拋出異常
*/
@Override
public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
System.err.println("調用真實對象前");
//CGLIB反射調用真實對象方法
Object result = methodProxy.invokeSuper(proxy, args);
System.err.println("調用真實對象后");
return result;
}
}
【測試】
public class TestCglibProxy {
public static void main(String[] args) {
CglibProxyExample cglibProxyExample = new CglibProxyExample();
Class[] argumentTypes = new Class[]{String.class};
Object[] arguments = new Object[]{"baipengfei"};
HelloGod helloGod = (HelloGod) cglibProxyExample.getProxy(HelloGod.class, argumentTypes ,arguments);
helloGod.helloGod();
}
}