package com.djk.design.struct.proxy;
public interface Move
{
void move();
}
package com.djk.design.struct.proxy;
public class Car implements Move
{
@Override
public void move()
{
System.out.println("汽车启动");
}
}
package com.djk.design.struct.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class CarProxy implements InvocationHandler
{
private Move move;
public CarProxy(Move move) {
super();
this.move = move;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("汽车准备启动");
method.invoke(move,null);
System.out.println("汽车停止了");
return null;
}
}
package com.djk.design.struct.proxy;
import java.lang.reflect.Proxy;
public class CarClient
{
public static void main(String[] args)
{
Move car = new Car();
Move move = (Move) Proxy.newProxyInstance(car.getClass().getClassLoader(), car.getClass().getInterfaces(), new CarProxy(car));
move.move();
}
}
这是利用了jdk提供的动态代理,可以看出jdk的动态代理必须要依赖接口,没有接口jdk的动态代理就用不起来。
jdk的动态代理的大致过程是Proxy类利用动态编译生成了一个实现了被代理接口的实现类,然后该实现类里面还有一个InvocationHandler的引用,所以当调用接口的方法的时候
这个生成的实现类里面调用了InvocationHandler接口里面的invoke,所以要添加代理方法可以写在InvocationHandler的实现类里面。