JAVA动态代理之:接口InvocationHandler

在java种怎样实现动态代理呢 
         * 第一步,我们要有一个接口,还要有一个接口的实现类,而这个实现类呢就是我们要代理的对象, 
         * 所谓代理呢也就是在调用实现类的方法时,可以在方法执行前后做额外的工作,这个就是代理。 
         * 第二步,我们要自己写一个在要代理类的方法执行时,能够做额外工作的类,而这个类必须继承InvocationHandler接口, 
         * 为什么要继承它呢?因为代理类的实例在调用实现类的方法的时候,不会调真正的实现类的这个方法, 
         * 而是转而调用这个类的invoke方法(继承时必须实现的方法),在这个方法中你可以调用真正的实现类的这个方法。
1.接口:
public interface IUser {
public String getName();
}
2.接口对应的类:
public class UserImp implements IUser {
String name;
public UserImp(String name){
this.name = name;
}
public String getName() {
return name;
}

}
3.监听方法所在类,该类实现了InvocationHandler 接口,通过invoke方法利用java的反射机制实现对相关方法的监听。
public class Handler implements InvocationHandler {


public Object targetObj;


public Handler(Object targetObj) {
this.targetObj = targetObj;
}

public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {

System.out.println("before the function \""+method.getName()+"\"");
Object ret = method.invoke(targetObj, args);
System.out.println(ret);
System.out.println("after the function \""+method.getName()+"\"");

}

}
4.测试方法:
public class testMain {

public static void main(String[] args) {

IUser realUser = new UserImp("sun");
Handler hand = new Handler(realUser);
IUser proxy = (IUser) Proxy.newProxyInstance(realUser.getClass().getClassLoader(), realUser.getClass().getInterfaces(), hand);
proxy.getName();
}

}
5.输出结果:
before the function "getName"
sun
after the function "getName"


疑问:在步骤3中invoke(Object proxy, Method method, Object[] args)方法的参数proxy的作用是什么,如何使用?
proxy 是你在创建代理的时候有jvm生产的字节码, 文档上已经说的很清楚了, 保证这个proxy 可以转化成你的interface , 但没说这个proxy 就一定是一个可以执行的class

我的理解是 这里的 proxy 类似一个智能指针, 他的作用只不过 可以让jvm从这个指针中的到真正可以执行的代码的位置(就是的hander), 和 函数名称, 参数等信息而已

这点可以从  Proxy.newProxyInstance 的源代码中可以得到证实, 这个函数主要就是调用 getProxyClass 这个函数来创建代理类(也就是你的proxy)

分析这个 getProxyClass 函数, 他做的工作就是
1 整理你需要代理的接口
2 得到每个接口的方法, 参数等信息
3 把每个接口的方法,缓存一下(放到一个map里面, 估计是等到调用的时候, 方便找到)

4 最重要的, 生成proxy  注意, 这里的proxy 核心的部分 就是 刚才说的那个缓存 方法的map

5 最后返回,你要的接口。(这里也不需要判断了, 反正,最后也是你自己在hander里面处理, 只要有方法的名称就可以了)

proxy的执行顺序就是 根据接口找到 函数, 然后在map中找到函数真正的可以执行的代码, 然后在调用传到hander中去执行调用(这步由你完成),实际上就是 5 -> 4 -> 3 -> 2 所以可以看出, proxy 就是我刚才说的, 类似一个智能指针而已。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值