A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 陈欢 中级黑马   /  2012-7-20 23:14  /  1368 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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();
        }
}

1 个回复

倒序浏览
  第一个问题。返回的是一个代理的实例,实现了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。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马