java反射机制:代理类、动态代理类
代理类与委托类的关系:
代理类与委托类具有相同的接口,但委托类是接口的真正实现者,代理类只是调用委托类的相关方法来提供特定的服务,代理类可以为委托类预处理信息、把信息传递给委托类处理并进行事后处理。
代理类分为静态代理类和动态代理类。
动态代理类是利用java的反射机制生成。利用java.lang.reflect.Proxy类和java.lang.reflect.InvocationHandler接口.
比如HelloService是代理类和委托类的共同接口,其中HelloServiceIml是委托类,则生成动态代理类的方法:
1、首先创建InvocationHandler接口实例:
final HelloService helloService=new HelloServiceIml();
InvocationHandler handler=new InvocationHandler(){
public Object invoke(Object proxy,Method method,Object[] args) throws Exception{
//proxy是生成的动态代理实例,method是调用的方法,args是方法的参数值
return method.invoke(helloService,args);//调用委托类的方法进行处理返回结果
}
};
2、创建动态代理
HelloService helloServiceProxy=(HelloService)Proxy.newProxyInstance(HelloService.class.getClassLoader(),
new Class[]{HelloService.class},
handler);
Proxy生成动态代理的静态方法:
public static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler handler);
参数loader指定动态代理类的类加载器,interfaces指定动态代理类需要实现的所有接口,handler指定
与动态代理关联的InvocationHandler对象。其中InvocationHandler是动态代理类方法调用的接口,最主要的就是前面所实现的invoke方法。