java设计模式之四:代理模式 java静态代理和动态代理(二)

2014-11-24 07:56:14 · 作者: · 浏览: 2
ionHandler {

private Object target;

/**
* DOC 通过反射动态生成一个代理对象.调用该对象的任何一个方法,都会进入invoke方法里
*
* @param target
* @return
*/
public Object bind(Object target) {
this.target = target;
return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
}

@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object result = null;
System.out.println("方法执行之前...");
result = method.invoke(target, args);
System.out.println("方法执行之后...");
return result;
}

}
package auction;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class DynamicProxy implements InvocationHandler {

private Object target;

/**
* DOC 通过反射动态生成一个代理对象.调用该对象的任何一个方法,都会进入invoke方法里
*
* @param target
* @return
*/
public Object bind(Object target) {
this.target = target;
return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
}

@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object result = null;
System.out.println("方法执行之前...");
result = method.invoke(target, args);
System.out.println("方法执行之后...");
return result;
}

}

[java] package auction;

/**
* DOC 拍卖行类
*/
public class AuctionShop implements IAuctionShop {

/**
* 卖东西
*/
public void sellGoods() {
System.out.println("您拍卖了XXX东西");
}

/**
* 买东西
*/
public void buyGoods() {
System.out.println("您购买了XXX东西");
}

}
package auction;

/**
* DOC 拍卖行类
*/
public class AuctionShop implements IAuctionShop {

/**
* 卖东西
*/
public void sellGoods() {
System.out.println("您拍卖了XXX东西");
}

/**
* 买东西
*/
public void buyGoods() {
System.out.println("您购买了XXX东西");
}

}

测试类:

[java] package test;

import auction.AuctionShop;
import auction.DynamicProxy;
import auction.IAuctionShop;

public class DynamicProxyTest {

public static void main(String[] args) {
DynamicProxy proxy = new DynamicProxy();
IAuctionShop auctionShop = (IAuctionShop) proxy.bind(new AuctionShop());
auctionShop.buyGoods();
}

}
package test;

import auction.AuctionShop;
import auction.DynamicProxy;
import auction.IAuctionShop;

public class DynamicProxyTest {

public static void main(String[] args) {
DynamicProxy proxy = new DynamicProxy();
IAuctionShop auctionShop = (IAuctionShop) proxy.bind(new AuctionShop());
auctionShop.buyGoods();
}

}

测试结果:

方法执行之前...
您购买了XXX东西
方法执行之后


摘自 a107494639的专栏