java,簡單實現cglib動態代理。
阿新 • • 發佈:2018-12-21
Cglib是動態代理的一種實現方式,用來代理普通的javaBean,
/** * 實現MethodInterceptor * @author MyComputer * */ public class CGLibProxy implements MethodInterceptor{ // Generates dynamic subclasses to enable method interception private Enhancer enhancer = new Enhancer(); /** * this 表示為回撥函式,此處為執行代理時候執行的一些操作 * @param suoperClass 使用者代理的父類 * @return */ public <T>T getProyInfo(Class<T> suoperClass){ return (T)enhancer.create(suoperClass,this); } /** * enhancer.create()的返回物件呼叫方法時候進入的攔截方法,可以執行自己的邏輯 */ @Override public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable { System.err.println("-------呼叫方法之前---------------"); // 呼叫父類中方法 Object invokeSuper = proxy.invokeSuper(obj, args); System.err.println("-------呼叫方法之後---------------"); return invokeSuper; } }
public class CGLibTest { public String cgLibTest(String str){ System.err.println("-----------------呼叫反射方法傳入的param為:------"+str); return "呼叫反射方法返回"+str; } /** * 此處用test測試,如果用main方法測試,則回報錯誤: * java.lang.NoClassDefFoundError: net/sf/cglib/proxy/MethodInterceptor * 這是由於此時沒有專案中的jar包沒有用maven管理,無法打到依賴專案的目的。 */ @Test public void test() { CGLibProxy cgLibProxy = new CGLibProxy(); CGLibTest proyInfo = cgLibProxy.getProyInfo(CGLibTest.class); String cgLibTest = proyInfo.cgLibTest("呼叫反射"); System.err.println(cgLibTest); } }
最終輸出的結果為:
-------呼叫方法之前--------------- -----------------呼叫反射方法傳入的param為:------呼叫反射 -------呼叫方法之後--------------- 呼叫反射方法返回呼叫反射