本文是在学习如下博文的一些总结。
http://zhangjunhd.blog.51cto.com/113473/69996
代理模式:
增加了一个中介,利用此中介调用实现类的逻辑,对外只公布中介,外部代码不能直接访问实现类。
应用场景:
当不希望将实现类完全暴露给调用方时,可以实现代理模式。调用方直接调用代理,而代理调用实现类。
规则:
为保证对调用者透明,代理类和实现类一般都实现同一个接口,这样,调用者就感觉直接调用了实现类。
JAVA 的Proxy类
为实现代理模式,java提供了一个类Proxy。
Proxy可以根据相应接口,生成相应的代理类,而后得到代理实例,此代理实例被调用后将调用InvocationHandler 。
所以InvocationHandler 需要实现具体的执行逻辑。
以下对Proxy的重要方法做一些解析。
1)public static Class<?> getProxyClass(ClassLoader loader,
Class<?>... interfaces)
throws IllegalArgumentException
此方法主要实现下列逻辑
- · 动态生产class,此class实现了interfaces数组所有的接口,且有一个构造方法,仅有一个入参为InvocationHandler类型。
- · 使用loader加载此class
- · 最后,返回Class对象。
2)
public static Object newProxyInstance(ClassLoader loader,
Class<?>[] interfaces,
throws IllegalArgumentException
此方法实现逻辑如下
- · 首先调用getProxyClass(),获得了一个Class对象 Proxyclass,
- · Constructor ProxyConstructor=Proxyclass.getConstructor(new Class[] { InvocationHandler.class });//获取Constructor
- · Object proxy2= (Object) ProxyConstructor.newInstance(new InvocationHandler [ ] { h}); //利用Constructor