所谓动态代理,即通过代理类: Proxy的代理, 接口和实现类之间可以不直接发生联系,而可以在运行期( Runtime)实现动态关联。I
java动态代理主要是使用java.lang.reflect
包中的两个类。
InvocationHandler类
public Object invoke(Object obj,Method method,Object[] obs)
其中第一个参数obj指的是代理类,method是被代理的方法,obs是指被代理的方法的参数组。此方法由代理类来实现。
Proxy类
protected Proxy(InvocationHandler h)
;
static Class getProxyClass(ClassLoader loader,Class[] interfaces)
;
static Object newProxyInstance(ClassLoader loader,Class[]interfaces,InvocationHandler h)
;
动态代理其实是在运行时生成class,所以,我们必须提供一组interface,然后告诉他class已经实现了这些interface,而且在生成Proxy的时候,必须给他提供一个handler, 让他来接管实际的工作。
代码示例:
测试主类:
package proxy;
public class Test {
public static void main(String[] args) {
Person person = new Person();
CreateProxy createProxy = new CreateProxy();
Subject o = (Subject)createProxy.create(person);
o.shopping();//invoke
}
}
/**
运行结果:
搭建平台.....
商品选品
付款,买到一大堆零食
完成交易!
*/
Subject 类
package proxy;
public interface Subject {
public void shopping();
}
Person 类
package proxy;
public class Person implements Subject {
@Override
public void shopping() {
System.out.println("付款,买到一大堆零食");
}
}
CreateProxy类:
package proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
//用于动态生成代理对象
public class CreateProxy implements InvocationHandler {
private Object target;//相当于Person对象
public Object create(Object target){
this.target=target;
//创建代理对象,参数为类加载器,对象所在类的接口
Object proxy = Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
return proxy;
}
//代理对象要执行的方法
//proxy:代理对象
//method:被代理要执行的方法(即shopping)
//args:被代理对象的参数
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("搭建平台.....");
System.out.println("商品选品");
//反射获取方法
method.invoke(target,args);
System.out.println("完成交易!");
return null;
}
}