public calss Tank implements Movable{
public void move(){
//记录开始的时间
long start = System.currentTimeMillis();
System.out.println(“Tank moving claclacla…”);
try{
//随机睡眠10秒钟,模拟它开了几秒钟
Thread.sleep(new Random().nextInt(10000));
}catch(InterruptedException e){
e.printStackTrace();
}
//记录结束的时间
long end = System.currentTimeMillis();
//输出结束减开始的时间
System.out.println(end - start);
}
//写方法测试一下
public static void main(String[] args){
Tank t = new Tank();
t.move();
}
}
interface Movable{
void move();
}
第二种方法:
//用代理
public calss Tank implements Movable{
public void move(){
System.out.println(“Tank moving claclacla…”);
try{
//随机睡眠10秒钟,模拟它开了几秒钟
Thread.sleep(new Random().nextInt(10000));
}catch(InterruptedException e){
e.printStackTrace();
}
}
//写方法测试一下
public static void main(String[] args){new TankTimeProxy(new tank().move();}
}
//时间代理
class TankTimeProxy implements Movable{
Tank tank;
public void move(){
//输出开始的时间
long start = System.currentTimeMillis();
tank.move();
//输出结束的时间
long end = System.currentTimeMillis();
//输出结束减开始的时间
System.out.println(end - start);
}
}
//日志代理
class TanklogProxy implements Movable{
Tank tank;
public void move(){
//开始
《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》
【docs.qq.com/doc/DSmxTbFJ1cmN1R2dB】 完整内容开源分享
System.out.println(“start moving…”);
tank.move();
//结束
System.out.println(“stopped”);
}
}
interface Movable{
void move();
}
最终的静态代理:
- 他们共同实现了Movabel这个接口,代理的类型也是Movable,所以他们之间可以相互嵌套。
public calss Tank implements Movable{
public void move(){
System.out.println(“Tank moving claclacla…”);
try{
//随机睡眠10秒钟,模拟它开了几秒钟
Thread.sleep(new Random().nextInt(10000));
}catch(InterruptedException e){
e.printStackTrace();
}
}
//写方法测试一下
public static void main(String[] args){new TankTimeProxy(new TankLogProxy(new tank())).move();}
}
//时间代理
class TankTimeProxy implements Movable{
Movable m;
public TankLogProxy(Movable m ){this.m = m;}
public void move(){
//输出开始的时间
long start = System.currentTimeMillis();
m.move();
//输出结束的时间
long end = System.currentTimeMillis();
//输出结束减开始的时间
System.out.println(end - start);
}
}
//日志代理
class TanklogProxy implements Movable{
Movable m;
public TankLogProxy(Movable m ){this.m = m;}
public void move(){
//开始
System.out.println(“start moving…”);
m.move();
//结束
System.out.println(“stopped”);
}
}
interface Movable{
void move();
}
- 我们看一下类图
代理对象和被代理对象都实现了Movable接口,将需要的操作添加到代理对象中的move()方法,接下里调用被代理对象的move()方法,这样就可以嵌套了,因为TimeProxy和LogProxy都实现了Movable接口,所以都可以添加到m:Movable这个被代理对象里
静态代理我们说完了,下面来说说动态代理
- 动态代理之所以称为动态,是因为代理类在运行时由Proxy类产生,这就大大减少了需要我们手工设计代理类的数量,在实际应用中,Proxy通过类装载器和需要实现的接口来产生代理类,即Proxy.getProxyClass(ClassLoader, Class[]),返回为代理类的Class实例。
public calss Tank implements Movable{
//模拟坦克移动了一段时间
public void move(){
System.out.println(“Tank moving claclacla…”);
try{
//随机睡眠10秒钟,模拟它开了几秒钟
Thread.sleep(new Random().nextInt(10000));
}catch(InterruptedException e){
e.printStackTrace();
}
}
public static void main(String[] args){
Tank tank = new Tank();
Movable m = (Movable)Proxy.newProxyInstonce(Tank.calss.getCalssLoader(),new Class[]{Movable.class},//tank.calss.getInterfaces()
newLogHander(tank);
);
m.move();
}
}
class LogHander implements InvocationHandler{
Tank tank;
public LogHander(Tank tank){
this.tank = tank;
}
public Object invoke(Object proxy,Method methos,Object[] args){