所谓动态代理,就是在程序运行时生成代理类,而无需像静态代理那样一个个得编写代理类,动态代理的实现方式比较多:有java代理、CGlib代理、ASM库等等。依次了解一下。
Java动态代理
InvocationHandler接口
Java动态代理需要代理类实现InvocationHandler接口,当我们通过代理类调用一个方法时,这个方法就会被转发给代理类的invoke方法来调用,InvocationHandler接口只有一个方法:
public Object invoke(Object realSubject,Method method,Objects[] args)throw Throwable;
realSubject是委托对象,method是该对象被调用的方法,args是调用该方法需要传入的参数。
java.lang.reflect.Proxy
该类时Java动态代理的生成器,提供了以下静态方法用以生成代理类:
/**根据传入的类加载器、接口实现代理类**/
public static Class getProxyClass(ClassLoader loader,Class<?> interfaces);
/**根据传入的类加载器、接口,调用处理器动态生成代理类**/
public static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h);
/**根据传入的代理类获取其对应的调用处理器**/
public static InvocationHandler getInvocationHandler(Object proxy);
例程:
public interface Vehicle{
public void move();
}
public class Car{
public void move(){
system.out.println("The car is moving..." );
}
}
public class ProxyCar implements InvocationHandler{
private Object proxies;
public ProxyCar(Object proxies){
this.proxies=proxies;
}
/**invoke方法的参数还是很好记忆的,就是被代理的对象,需要调用的方法,方法所需参数**/
public Object invoke(Object proxies,Method method,Object[] args)throws Throwable{
Object result=null;
/**此处可以进行方法调用前预处理**/
result=method.invoke(proxies,args);
/**此处可以进行方法调用后置处理**/
return result;
}
}
public class Drive{
public static void main(String[] args){
Car car=new Car();
Vehicle vehicle= Proxy.newProxyInstance(Vehicle.class.getClassLoader,new Class[]{Vehicle.class},new ProxyCar(car));
car.move();
}
}
//TODO