一、例子
先看一个简单的动态代理例子:
car接口
public interface Car {
public String doSomething();
}
car实现类
public class CarImpl implements Car {
@Override
public String doSomething() {
System.out.println("run ... ");
return "car";
}
}
public class CarInvocation implements InvocationHandler {
private Car car;
public CarInvocation(Car car) {
this.car = car;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("before");
//Object result = method.invoke(car, args);
System.out.println("after");
return "result";
}
}
public class Main {
public static void main(String[] args) {
CarInvocation carInvocation = new CarInvocation(new CarImpl());
Car car = (Car)Proxy.newProxyInstance(Main.class.getClassLoader(), CarImpl.class.getInterfaces(), carInvocation);
String s = car.doSomething();
System.out.println(s);
}
}
二、原理
1:Proxy.newProxyInstance会返回一个实现car接口的匿名类,这个匿名类里有重写了toString、equals、hashCode方法,并实现了car接口里定义的doSomething方法;
2:carInvocation会以参数形式传进匿名类;当调用car.doSomething()方法时,实质是调用匿名类里的doSomething方法,匿名类里的doSomething方法又调用了carInvocation里的invoke方法,其方法第二个参数为doSomething方法,所以达到了代理的效果。
生成的匿名类:
调用流程图: