Tank t= new Tank(); TimeHandler h= new TimeHandler(t); Moveable m=(Moveable)Proxy. newProxyInstance(Moveable. class,h);//这句话就是我的Moveable接口的实现类Tant 要实现计时功能 m.move(); }
}
运行:
结果: com.sun.tools.javac.api.JavacTool class com.text.TankTimeProxy Tank moving.... 6775
我们来整理一下我们的思路
首先我们有一个Tank对象,它实现了一个moveable接口,它就具有了一个move移动的方法,我们想在move方法的前后加上一些逻辑,这些逻辑由我们来定,所以我们首先定义自己的逻辑,我们就建立了TimeHandler类,当调用这个类的时候,就会把Tank的代理类的实体传进来,我们就可以在move方法的前后加上一些逻辑。
这样做的好处就是可以对任意的对象,任意的接口,实现任意的代理
我们现在来写一个Person 类
public class Person implements Moveable{
@Override public void move() { System. out.println("我正在走路" ); try { Thread. sleep( new Random().nextInt(10000)); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } }
}
我们也来实现计时
测试: public class Client { public static void main(String[] args) throws Exception{
Person person= new Person(); TimeHandler h= new TimeHandler(person); Moveable m=(Moveable)Proxy. newProxyInstance(Moveable. class, h); m.move(); }
} 结果: com.sun.tools.javac.api.JavacTool class com.text.TankTimeProxy 我正在走路 com.text.TankTimeProxy 8240
我想你发现代理类的好处了吧。。。。。就是只需要写一次,你就可以在任意的类中完成任意的代理
再来测试不同的接口
public interface Run { public void run();//跑 }
我们用Person来实现这个接口,并计时
public class Person implements Pao {
@Override public void rrrrun() { System. out.println("我正在跑步" ); try { Thread. sleep( new Random().nextInt(10000)); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } }
}
测试: public class Client { public static void main(String[] args) throws Exception{
Person person= new Person(); TimeHandler h= new TimeHandler(person); Pao m=(Pao)Proxy. newProxyInstance(Pao. class, h); m.rrrrun(); }
}
结果:
com.text.Paollll com.sun.tools.javac.api.JavacTool class com.text.TankTimeProxy public void com.text.TankTimeProxy.rrrrun() 我正在跑步 com.text.TankTimeProxy 8171