动态代理(dynamic proxy)
利用Java反射(reflection),在创建一个实现某些给定接口的新类(动态代理类)及其实例对象,代理的是接口(interfaces),不是类,也不是抽象类,在运行时才知道具体的实现,spring AOP就是此原理。
例子:定义一个接口
/**
*
* @author WangHeng
*
*/
public interface TargetClass {
// 定义一个普通方法
public void sayHi();
}
接口的实现类
/**
* @author WangHeng
*/
public class TargetClassImpl implements TargetClass{
@Override
public void sayHi() {
System.out.println("我是动态代理");
}
}
定义一个类来实现 InvocationHandler 接口(JDK提供)
/**
* @author WangHeng
*/
public class InvocationHandlerImpl implements InvocationHandler {
// 不知道什么类型,这个直接定义为Object
private Object obj;
public InvocationHandlerImpl(Object obj) {
super();
this.obj = obj;
}
/**
* 重写invoke方法
* invoke三个参数:
* proxy:就是代理对象,newProxyInstance方法的返回对象
* method:调用的方法
* args: 方法中的参数
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("调用之前增强一些功能");
Object invoke = method.invoke(obj, args);
System.out.println("调用之后增强一些功能");
return invoke;
}
}
测试一下
public class TestDynamicProxy {
public static void main(String[] args) {
TargetClass target = new TargetClassImpl();
/**
* newProxyInstance,方法有三个参数:
* loader: 用哪个类加载器去加载代理对象
* interfaces:动态代理类需要实现的接口
* h:动态代理方法在执行时,会调用h里面的invoke方法去执行
*/
TargetClass newProxyInstance = (TargetClass) Proxy.
newProxyInstance(TargetClass.class.getClassLoader(),
new Class<?>[] { TargetClass.class },
new InvocationHandlerImpl(target));
newProxyInstance.sayHi();
}
}