TA的每日心情 | 衰 2021-2-2 11:21 |
---|
签到天数: 36 天 [LV.5]常住居民I
|
Common.java:
6 l( {2 w4 \0 e. B/ g" b8 N. Q( y
% m/ X9 f# R% I7 c9 w- public interface Common {
4 Q- g' a7 M! G: k3 ~
9 Z. g7 U2 z# ~' a- public void action();
' l; L l) J% ~9 w7 d/ p2 q - }
# G6 m) L" S: x* L" k# S
复制代码 4 ]) O# f3 K4 V7 S
MyProxyed.java:# U2 m+ I% Z3 _8 C; U6 W' o
- /**
& J( D% b7 ?% G( Y - * 被代理类
8 H v# }) k# k - * @author Administrator# F$ D* \. P2 W
- *# x) b# s$ v5 x/ x' V
- */
: Y7 ?9 [" H* _: ?8 ~8 s - public class MyProxyed implements Common{
5 }; d4 J" o0 f7 Y+ ` - 8 A% A+ N" W( K9 o- ]
- public MyProxyed(){) I- N6 V) X( H( C
-
6 h. Q( C$ r, v5 ^' p - }
3 P! {. ~. Q3 J/ e - @Override
6 T+ x6 i7 C; ?( d, R - public void action() {, w: L# r$ r+ ]# G3 F6 y
- // TODO Auto-generated method stub
$ V- u2 K; _" k/ {, B - System.out.println("我是被代理类,别忘了我。。。。");7 I3 `: f. k! j3 H
- }- t3 @ Q! D; Q2 t) ~: |! x
9 B7 ~, l Z# D5 b- A: k; {, M- }
/ Q* A& ?% z- w2 Q* R
复制代码 ProxyClass.java:
$ T' U/ H9 y/ d" Z4 F6 g- import java.lang.reflect.InvocationHandler;9 {* c. n% R) _
- import java.lang.reflect.Method;
4 s7 l: n! P2 }- U" M; b# U# J) q/ S - import java.lang.reflect.Proxy;
0 z& T/ Y# ?( B/ Y8 o - & Z! k; Z% y+ o2 D2 _9 k T- g
* v$ @ n) \& f2 z4 O- public class ProxyClass implements InvocationHandler {
* c$ c5 I" [8 |! e& h0 Q4 ^ - Object obj;% k5 E, m1 A. e" q! r
- /**
% S' \: d' X* W* I A - * 用于生成代理类
7 G+ Y2 k% L1 I; m0 T' u: O - * @param obj 被代理类对象6 [9 l! q8 m5 y3 n3 V
- * @return 一个代理类' X" J- J% P$ T; s, Y5 U @
- */" a) J. A- @4 R/ Y6 ~/ R+ p& ~+ q
- public Object blind(Object obj){
- I, H+ r5 k$ V" u - this.obj=obj;7 B; @9 j( B$ Z4 G B: N4 R: F
- return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), this);3 u7 ]5 c5 n; E. L9 G0 ?
- }# s' q4 {1 X9 \
- /**
; H# _ }9 [2 ~5 W) x7 a" L" E* U - * 代理类对象调用接口方法时,实质上是返回来调用了该方法3 M% P0 Z( G( ^; T, U0 A* h+ ^5 m
- */6 X1 f" p# p$ l; w2 z8 n
- @Override
5 d7 Q% W5 M4 O% v - public Object invoke(Object arg0, Method arg1, Object[] arg2)
# g6 g6 e: \0 | y2 ^# M4 j" a; K - throws Throwable {8 J2 L7 q. u( h4 r' T0 `
- // TODO Auto-generated method stub. D' j3 v- W7 [0 ], }% Y
- Object returnVal=arg1.invoke(obj, arg2);
, r$ V/ a4 A& I- P - System.out.println("我是代理类");
4 Z6 h$ B1 |$ L; Q4 m* y+ s, G - return returnVal;
' I% F1 m* z, @; `* c - }; L* M; ^5 z% X( d6 \3 y
- ! t" I! Z4 ~# X! ], B+ K
- }5 h" i- K& ]; b$ m7 k8 m
复制代码 Test.java:
3 n7 s) r* i( q0 ~3 o/ \/ d9 s- /**
9 g# y% ~# P) I& I2 \, O - * 一个动态代理的例子- o( |5 q" Z3 s7 o' f) c$ W
- * @author Administrator& V1 `: V K" t/ Q1 p% y8 T, C; ]
- *被代理类和代理类有共同的方法,代理类调用方法时,其是实质是调用了InvocationHandler中的invoke方法
# O' j# s m1 H, v* K - */
: A: j5 K0 O/ J0 T/ e - public class Test {, u5 s' K& C$ l7 e( U$ \' ]6 m2 r
- . S5 d3 C. J5 r6 t: z
- public static void main(String[] args) {
, Z& x- v/ J& L - // TODO Auto-generated method stub
) p1 t3 C4 T8 k - MyProxyed proxyed=new MyProxyed();& O4 c" N' K& Z6 A; \
- ProxyClass proxy=new ProxyClass();
) j* y* ^6 J. C- a - //这个是真正的代理类
6 W, i1 M+ X7 Z7 E6 i - Object obj=proxy.blind(proxyed);
* A, y4 _" @7 l. a/ ^7 l - Common common=(Common)obj;3 ^, l) _" h2 b" _) D
- common.action();
' o( Z( A e: @# k* G: F - }
) o8 \$ \+ j( w3 I+ i& r - , L9 X5 L3 ], R
- }7 i% a: _9 g. C# Y
复制代码
7 s R( _. H/ y$ |9 y+ P
ProxyTest.zip
(5.52 KB, 下载次数: 5)
2 F ^, ]# b7 E! V1 w [' C6 _3 M) Y+ [
|
|