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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© aion2013tian 中级黑马   /  2013-12-27 18:04  /  988 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. package test;

  2. import java.lang.reflect.InvocationHandler;
  3. import java.lang.reflect.Method;
  4. import java.lang.reflect.Proxy;

  5. /**
  6. * @author Xing,Ming
  7. * @version 2013年12月27日 下午4:52:08
  8. */
  9. public class Client {
  10.         public static void main(String[] args) {
  11.                
  12.                 RealSubject realSubject = new RealSubject();
  13.                
  14.                 InvocationHandler handler = new DynamicSubject(realSubject);
  15.                
  16.                 Class<?> classType = handler.getClass();
  17.                
  18.                 /**
  19.                  * 这行代码返回的到底是个什么?就是Subject类型?还是强制转换了?
  20.                  * 为什么执行pro.request();
  21.                  * 之后会调用DynamicSubject类里面的那个method.invoke方法
  22.                  */
  23.                 Subject pro = (Subject) Proxy.newProxyInstance(classType
  24.                                 .getClassLoader(), realSubject.getClass().getInterfaces(),
  25.                                 handler);
  26.                
  27.                 pro.request();
  28.         }
  29. }

  30. interface Subject {
  31.         public void request();
  32. }

  33. class RealSubject implements Subject {
  34.         public void request() {
  35.                 System.out.println("From real subject");
  36.         }
  37. }

  38. class DynamicSubject implements InvocationHandler {
  39.         private Object sub;

  40.         public DynamicSubject(Object sub) {
  41.                 this.sub = sub;
  42.         }

  43.         @Override
  44.         public Object invoke(Object proxy, Method method, Object[] args)
  45.                         throws Throwable {
  46.                 // TODO Auto-generated method stub
  47.                 method.invoke(sub, args);
  48.                 return null;
  49.         }
  50. }
复制代码

为什么会调用invoke方法,这个方法到底是做什么的啊?

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

2 个回复

倒序浏览
动态代理机制:其实动态代理机制最核心的就是InvocationHandler这个接口(调用处理器)。InvocationHandler是代理实例的调用处理程序实现的接口。每个代理实例都有 一个关联的调用处理程序。对代理实例调用方法时,将对方法调用进行编码并将其指派到它的调用处理程序的invoke方法。
method.invoke(sub, args);的sub对象映射了new DynamicSubject(realSubject);的realSubject,而该对象是RealSubject的一个实例,并实现了interface Subject,
Subject pro = (Subject) Proxy.newProxyInstance(classType
                                .getClassLoader(), realSubject.getClass().getInterfaces(),
                                handler);
就是创建一个代理类的实例pro,并加载关联的调用处理器类,关联的目标接口和目标类。
pro.request();
就是调用关联目标类的request()方法,即用代理实例对象pro调用目标类RealSubject中的request().



评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
InvocationHandler 是一个接口。接口就是一种规则。
newProxyInstance 的参数中有InvocationHandler 类型的参数。说明这个方法要实现这种规则。
这个接口只有一个方法  invoke   
看invoke的参数。。三个参数     代理实例   方法    object[ ]
分别对应     你代理对象代理的是谁         你代理的谁要执行的方法            要执行方法的参数。
可以看出  这个方法  是代理实现的核心。   代理时要替别人做事情。  
invoke方法正好明确了   你要替谁做    做什么     怎样做。。

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马