静态:
首先需要一个接口
public interface Neting {
public void netting();
public String playGame(String name);
}
然后需要一个实例去继承:
public class NetImpl implements Neting {
@Override
public void netting() {
System.out.println("上网中....");
}
@Override
public String playGame(String name) {
System.out.println("游戏中....");
return "game over";
}
}
最后需要一个同样实现了相同接口的类来做代理,并在每个方法中加入需要的操作:
public class NetingImplProxy implements Neting {
private Neting neting;
public NetingImplProxy(Neting neting){
this.neting=neting;
}
@Override
public void netting() {
this.up();
neting.netting();
this.down();
}
@Override
public String playGame(String name) {
this.up();
String str=neting.playGame(name);
this.down();
return str;
}
private void up(){
System.out.println("拨号中");
}
private void down(){
System.out.println("断开中");
}
}
这样产生的结果是每次更改方法中固定的操作时,都需要更改类的源代码,带来很多不便,由此产生动态代理。
动态代理需要一个Proxy类和invocationhandle接口来支持:
同样,上述的接口和实现类都不变,不再需要代理类,而是由下面这个类动态产生:
public class NetHandle implements InvocationHandler {
//首先需要传一个目标对象的引用
private Object targetObject;
//设置构造方法时,直接将目标对象作为参数传入
public NetHandle(Object targetObject){
this.targetObject=targetObject;
}
//这是至关重要的,由此类实例的本方法产生一个$...代理对象:
public Object createProxyInstance(){
return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(),
targetObject.getClass().getInterfaces(),
this);
}
//代理对象会自动调用复写后的invoke方法,类似filter中的dofilter;
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
up(); //在此加入需要增加的操作
Object ret=method.invoke(targetObject, args);
down();//在此加入需要增加的操作
return ret;// 如果没有返回值,则返回null。
}
private void up(){
System.out.println("拨号中");
}
private void down(){
System.out.println("断开中");
}
}
测试:
public static void main(String[] args) {
NetHandle n=new NetHandle(new NetImpl());
Neting net=(Neting) n.createProxyInstance();
net.netting();
System.out.println(net.playGame(""));
}
运行结果:
拨号中
上网中....
断开中
拨号中
游戏中....
断开中
game over