TA的每日心情 | 衰 2021-2-2 11:21 |
---|
签到天数: 36 天 [LV.5]常住居民I
|
Common.java:. d8 P) R; N4 G5 \( x8 `
0 M6 ^- b( G: Q* O, x3 X7 c- public interface Common {
3 j2 X- e# ^7 [/ Q8 m8 D! i5 X - . ^/ {) N6 T% J0 ^+ v6 E8 `
- public void action();, q3 {9 ~9 |# n& v" u. P2 |$ t
- }7 L3 t7 b# }; z; l
复制代码 ) a/ t# V& n, R3 U4 L' ~
MyProxyed.java:
6 b9 |$ N4 O( S8 q! @$ ?6 B- W- /**
5 d1 H) Q4 B% _7 ~* U4 u/ ?7 n - * 被代理类3 z( \# a) D6 O
- * @author Administrator
+ K5 I# v2 o/ g" a - *
, p* x0 V" Z" K- C# E# { - */6 ?$ J& `, `1 t. v; E
- public class MyProxyed implements Common{3 ~& B% h+ d- J- v* F/ k; ^% c
- ; n4 D0 P: n: J ]" O
- public MyProxyed(){+ S5 @7 \3 [- U
-
) Z' B8 R3 d w! W8 K - }
1 H& W) ? ]; [% A) o2 \6 m4 k - @Override& K+ @3 p0 P/ x3 k
- public void action() {# Q ?& q ]3 P7 D3 }) @9 K7 `
- // TODO Auto-generated method stub
, R" T0 A' ]# J+ U' s; n- S - System.out.println("我是被代理类,别忘了我。。。。");
; _5 _7 M' p7 l: b# i+ d - }
7 o9 Q% B2 A: x' N1 i
0 T0 J! `% e. D! [3 |- }
/ T# k. x8 t) c0 m
复制代码 ProxyClass.java:
3 v- D' C6 |8 K- import java.lang.reflect.InvocationHandler;
$ n! H/ X4 x A) F4 q) Y - import java.lang.reflect.Method;
' p/ \( ?: F: G4 W. p - import java.lang.reflect.Proxy;
) k- r, `4 y0 G: l/ G4 C
& i+ ?( o3 x6 Q- T/ j7 d- 1 I7 n: X/ w& Q0 N" R0 v+ G
- public class ProxyClass implements InvocationHandler {; z8 u7 f; u' R7 u, N$ N
- Object obj;: Q2 ~6 w& m; C; ?8 d0 [" p3 F# D8 g
- /**: E; ?3 w: v w/ `' `: t1 h
- * 用于生成代理类
- B) M) x4 ?; d" Z" [! `1 ~ - * @param obj 被代理类对象
8 N6 z5 x( Q( z0 {$ ?7 | - * @return 一个代理类
& b- Z9 c! A* Z) v+ F, s' t k: F* Z - */
4 d( J; _( Y" Y8 R8 n" v4 j+ u - public Object blind(Object obj){. k7 W; |, j7 n. S1 X9 j G, C; P
- this.obj=obj;7 o8 m) s6 K/ X% J6 P i
- return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), this);* Z9 i/ L2 H9 Z) ^3 v) U# D
- }
+ q! v0 I" ?# u3 }6 P: H o - /**. ^. G* ^$ u$ a' E2 _( R
- * 代理类对象调用接口方法时,实质上是返回来调用了该方法9 k/ i( i8 ^( Q7 ]
- */
4 ]* S; i1 F6 S. P- B5 U - @Override* ^( p# i6 S4 Z r8 B! P/ v
- public Object invoke(Object arg0, Method arg1, Object[] arg2)
$ C* F n; P. u/ W - throws Throwable {! o8 R j2 O C
- // TODO Auto-generated method stub" r# M% E# B; |' [% y) c
- Object returnVal=arg1.invoke(obj, arg2);7 P& h$ q5 n$ e. S3 p, l H) c
- System.out.println("我是代理类");
# s. Z9 n4 ?+ ~5 C Q - return returnVal;
# ]" u/ O8 m- } - }( T( u( n, F, T
. J2 l' v6 H9 H, M7 f7 Y" O- }3 N0 h8 V' K/ Z3 Y, L* P
复制代码 Test.java:
! r1 X- s* C/ n8 H# R1 o! e- /** U* j. W% E1 N2 }" ~
- * 一个动态代理的例子/ Y2 D- D& B5 @% j" m6 @* \
- * @author Administrator
5 E1 Q. f1 Y4 q+ e+ B - *被代理类和代理类有共同的方法,代理类调用方法时,其是实质是调用了InvocationHandler中的invoke方法
. q& z; V/ _* u; g2 c - */
7 I# Y- h2 n4 n - public class Test {
/ g+ |1 n; u+ P
: h4 n' _: A4 F( X, P) H* a! n- public static void main(String[] args) {! X: V p% J1 @9 z5 U/ G' z' \* A: \, \
- // TODO Auto-generated method stub# e! I2 x, { ^/ G/ s" _% X& V
- MyProxyed proxyed=new MyProxyed();+ v1 E" H) f0 D% f# @( R0 I: u! f
- ProxyClass proxy=new ProxyClass();
4 z; J( C! U) n: h0 x# x' e - //这个是真正的代理类
$ \0 [6 X( v) P5 T: o - Object obj=proxy.blind(proxyed); Z% \* @5 |4 W2 u* u8 H
- Common common=(Common)obj;9 }8 L! t9 @ R/ h0 f6 P5 r
- common.action();
6 p9 p' X- L5 ?( Y6 S - }9 A' V& j; j& a# E) v
- # e" f" O% I- B" t: c6 ^: b
- }9 h) f+ m, k; i' P2 M! m0 {
复制代码
4 A7 ^) z2 ]* i$ ]
ProxyTest.zip
(5.52 KB, 下载次数: 5)
! N' e) k, {% I$ ~* U
" N; w; J$ D- ~) l, \5 g( U |
|