Java代理模式之CGLIB動態代理
瞭解什麼是動態代理模式,可參考ofollow,noindex">Java設計模式之代理模式
簡介
前面我們瞭解了JDK動態代理技術,發現其真實物件必須提供接口才可以使用。在一些不提供介面的環境中,只能採用一些別的第三方技術,比如CGLIB動態代理。它的有事在於不需要提供介面,只要一個非抽象類就可以實現動態代理。
- 實現代理邏輯的類需要實現net.sf.cglib.proxy.MethodInterceptor介面
- 下面示例的具體程式碼可到cglib動態代理 中下載。
- 實驗需要引入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); } }
【動態代理繫結和代理邏輯實現】
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); //定義代理物件為當前物件,要求當前物件實現MethodInterceptor方法 enhancer.setCallback(this); //生成並返回代理物件 return enhancer.create(argumentTypes ,arguments); } /** * @param proxy 代理物件 * @param method 方法 * @param args 方法引數 * @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(); } }