标签:col target href IV 需求 AC struct exce const
为了使代理类和被代理类对第三方有相同的函数,代理类和被代理类一般实现一个公共的interface,该interface定义如下
1 2 3 4 |
|
被代理类定义如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
|
代理需求:在add函数和minus函数调用前后分别输出before invocation和after invocation字样
代码如下:简单直接,无需赘言,如果calculator里边不仅有add和minus,还有divide,product,log,sin…呢,呵呵哒
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
|
首先编写实现InvocationHandler接口的类,用于请求转发,实现如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|
生成动态代理
1 2 3 4 5 |
|
无论calculator中包含多少函数,动态代理只需实现一次,实际工程中,System.out.println(“in calculatorhandler, before invocation”)可能是加缓存,打日志等操作
为了搞清楚动态代理如何工作,首先看看生成的动态代理的代码是什么,借助[1]中ProxyUtil代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
|
得到了生成的动态代理代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 |
|
有点长,按照初始化顺序慢慢来分析,首先分析静态代码块:
1 2 3 4 5 6 7 8 9 10 11 |
|
得到公共interface中的add函数和minus函数对应的Method方法,同事也得到了equals,toString,hashCode三个函数的Method,所以调用代理类的equals,toString,hashCode也是要执行被代理类的方法的,知道这点很有必要
构造函数
1 2 3 4 |
|
初始化了内部的InvocationHandler变量,也就是下文的super.h
以add为例看一下请求的转发
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
super.h.invoke就是invocationhandler.invoke就是传入的CalculatorHandler中实现的
1 2 3 4 5 6 7 8 9 |
|
最终执行的就是CalculatorHandler对应的invoke函数
1 |
|
生成动态代理的过程步骤如下[2]:
1 2 3 4 5 6 7 8 9 10 11 12 |
|
Proxy.newProxyInstance帮我们做了2,3,4步,直接返回给我们一个动态代理对象,代理对象最终执行InvocationHandler中invoke函数。顺便强推文章[2]
标签:col target href IV 需求 AC struct exce const
原文地址:https://www.cnblogs.com/feng9exe/p/9241277.html