cglib實現動態代理構建帶參數的代理實例
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