cglib實現動態代理構建帶參數的代理實例

jopen 9年前發布 | 2K 次閱讀 Java

cglib實現動態代理構建帶參數的代理實例:

 
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;

/**

  • Created by Carl on 14-12-30. */ public class CglibProxy implements MethodInterceptor{ /**

    • 創建代理對象方法 *
    • @param target 代理對象
    • @param args 對應的構造器參數類型 *
    • 例:有構造器如下
    • public Person(name,age){...} name為String.class age為int.class
    • 寫入name的類型與age的類型 *
    • 則:new Class[]{String.class,int.class} *
    • @param argsValue 對應的構造器參數值 *
    • 例:如此創建對象 new Person("name",23) 用以下方式傳入:new Object[]{"name",23} *
    • @param <T> <泛型方法>
    • @return 返回跟代理對象類型 */ public <T> T getInstance(T target,Class[] args,Object[] argsValue){ Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(target.getClass()); enhancer.setCallback(this); return (T) enhancer.create(args,argsValue); }

      /**

    • 創建代理對象方法 *
    • @param target 代理對象
    • @param <T> <泛型方法>
    • @return 返回跟代理對象類型 */ public <T> T getInstance(T target){ Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(target.getClass()); enhancer.setCallback(this); return (T) enhancer.create(); }

      @Override public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable { Object result = null; try{

       System.out.println("Before "+method.getName()+" ..");
       result = methodProxy.invokeSuper(o,objects);
       System.out.println("End "+method.getName()+" ..");
      

      }catch(Exception e){

       System.out.println("Errod "+method.getName()+" ..");
      

      } return result; } }</pre>

      需引入 cglib-2.1.3.jar 和 asm.jar

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!