java的代理和cglib的代理

動態代理:隨用隨加載 1.基於接口的動態代理 使用jdk提供:Proxy 中的newProxyInstance()的方法
* 要求:被代理實現一個類,不然不能使用
* newProxyInstance()方法的參數
* ClassLoader 用於加載代理對象的字節碼,要求和被代理對象使用相同的類加載器 * interfaces, 讓代理對象和被代理對象具備相同的方法
* InvocationHandler 提供加強的代碼
* 有一個invoke方法
* proxy 代理對象的引用
* method 當前執行的方法
* args 當前執行方法所需的參數,和被代理對象有相同的返回值.net

//給出了main方法代理

public static void main(String\[\] args) {  
final Iproducer iproducer=new Producer();  
Iproducer proxy=  (Iproducer)Proxy.newProxyInstance(iproducer.getClass().getClassLoader(),

iproducer.getClass().getInterfaces(),
new InvocationHandler() {
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Float money=(Float)args[0];
Object value=null;
//判斷當前方法
if("sale".equals(method.getName()))
value= method.invoke(iproducer,money*0.8f);
return value;
}
});
proxy.sale(1000f);
}code

2.基於子類的動態代理 使用cglib對象

給出main方法 public static void main(final String[] args) {
final Producer producer = new Producer();接口

Producer enhanceProducer= (Producer) Enhancer.create(producer.getClass(), new MethodInterceptor() {
/**ip

  • * @param proxy 代理對象的引用
    * @param method 當前執行的方法
    * @param objects 當前執行方法所須要的參數
    * @param methodProxy 當前執行方法的代理對象
    * @return
    * @throws Throwable
    / public Object intercept(Object proxy, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable { System.out.println(proxy.getClass()); System.out.println(methodProxy.getClass()); Float money =(Float) objects[0]; Object value=null; if(method.getName().equals("sale")) value=method.invoke(producer,money0.8f); return value; } }); enhanceProducer.sale(10000f); }
相關文章
相關標籤/搜索