黑马程序员技术交流社区
标题:
代理的问题,有点晕
[打印本页]
作者:
陈欢
时间:
2012-7-20 23:14
标题:
代理的问题,有点晕
Subject pro = (Subject)Proxy.newProxyInstance(classType.getClassLoader(),realSubject.getClass().getInterfaces(),handler);
这行代码返回的到底是个什么?就是Subject类型?还是强制转换了?为什么执行
pro.request();之后会调用DynamicSubject类里面的那个method.invoke方法
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 sub)
{
this.sub = sub;
}
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable
{
method.invoke(sub,args);
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 pro = (Subject)Proxy.newProxyInstance(classType.getClassLoader(),
realSubject.getClass().getInterfaces(),handler);
pro.request();
}
}
作者:
鲍霄霄
时间:
2012-7-21 13:38
第一个问题。返回的是一个代理的实例,实现了subject接口的对象。然后强制转换成subject。这个代理就是RealSubject发言人,可以执行RealSubject所有的方法。代理执行方法就相当于RealSubject对象执行方法。Proxy.newProxyInstance()这个方法有三个参数。第一个是定义代理类型的一个加载者。第二个是要被代理对象的实现的接口列表,第三个是一个对象,这个对象要实现invocationhandler接口的invoke方法来执行invoke是英文是执行的意思。它就是执行方法的意思。 这个方法涉及到Method 这个类,这个类和Class类型一起用来设计反射。比如你想执行一个对象的方法其实有两种,一种是对象.method()。另一种是如下代码: Class c = Class.forName("com.teven.comefromnet.RealSubject"); Method m = c.getDeclaredMethod("request", null); m.invoke(realSubject, null); 这个用到反射。你可以只看两个类,Class,Method。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2