1. 第一个参数接受的是实现InvocationHandler接口的这个代理类对象,一般用不上,我们不用去管它。
2. 代理模式一般涉及到的角色有
(1) 抽象角色:声明真实对象和代理对象的共同接口。接口声明了这两个角色相同的操作,这样,代理就能以与真实对象相同的方式来与用户交互。
(2) 代理角色:代理对象角色内部含有对真实对象的引用,从而可以操作真实对象。同时代理对象提供与真实对象相同的接口,这样在任何时刻都能代替真实对象。代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装
(3) 真实角色:代理角色所代表的真实对象,是我们最终引用的对象。
我们来举个例子:
下面是抽象角色:
public interface Subject
{
public void request();
}
下面是真实角色:
public class RealSubject implements Subject
{
public void request()
{
System.out.println("From real subject!");
}
}
下面是我们的动态代理角色:
public class DynamicSubject implements InvocationHandler
{
private Object sub;
public DynamicSubject(Object obj)
{
this.sub = obj;
}
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable
{
System.out.println("before calling: " + method);
method.invoke(sub, args);
System.out.println(args == null);
System.out.println("after calling: " + method);
return null;
}
}
下面是我们的客户端
public class Client
{
public static void main(String[] args)
{
RealSubject realSubject = new RealSubject();
InvocationHandler handler = new DynamicSubject(realSubject);
Class<?> classType = handler.getClass();
// 下面的代码一次性生成代理
Subject subject = (Subject) Proxy.newProxyInstance(classType
.getClassLoader(), realSubject.getClass().getInterfaces(),
handler);
subject.request();
System.out.println(subject.getClass());
}
}
上面代码中realSubject.getClass().getInterfaces()就是我们所说的抽象角色。程序通过这个接口知道需要进行的操作。生成代理对象中,第一个参数是类加载器,第三个参数是InvocationHandler对象,这样就可以通过传入的这些参数动态地生成代理。而不是针对每一个真实角色,都要有一个对应的代理,这样的话,会导致产生大量的类,这就是需要动态代理的原因。
其实,代理可以理解成中介,比如,我们找兼职,不知道哪里有工作,所以通过中介来找工作。但最终还是要到用人单位去工作,而不是中介,所以中介要有一个用人单位的引用,实际操作时还是要让用人单位来提供工作,中介不能完成这个动作。希望能够帮助到你。
|