TA的每日心情 | 衰 2021-2-2 11:21 |
---|
签到天数: 36 天 [LV.5]常住居民I
|
Common.java:) X1 r6 p+ ^2 d8 w
- 2 d" Q0 P' L! A
- public interface Common {
2 K% h5 V/ Q3 Y1 Z4 k
, H! i8 d& y5 Y3 S0 u" y! e- public void action(); z# ]7 A5 B$ j$ @5 V u
- }! N. y2 T3 [8 i/ Q
复制代码
3 e b) j& q& C) i# D$ p% ZMyProxyed.java:
/ p' [; k- X& p% P4 V$ j) n+ P- /**& `; J" W0 G$ ]5 ^4 i' d
- * 被代理类
/ k0 E, Q1 t5 t, a" G - * @author Administrator
) k- o$ x8 T7 c$ Y9 R2 P - *
3 c8 E; X6 ~. u; s3 S! g# M1 n - */% g/ u& `* V% A& {6 i) _9 @
- public class MyProxyed implements Common{$ G$ J# d* i/ w
7 I8 J5 F* A$ @7 B/ G* ~- y+ n- public MyProxyed(){* q4 d6 n- j# A: A y# U8 @
-
5 `: X8 k2 X9 Y7 M& b - }
+ T7 z- S0 S4 O! `7 X$ w - @Override
3 p& F" N9 _+ X% G R5 K# F - public void action() {, ^+ K |3 C0 E
- // TODO Auto-generated method stub( E! x8 Y# v3 F* W
- System.out.println("我是被代理类,别忘了我。。。。");( c$ ]8 [& S8 w$ j' K9 U* [8 |
- }4 t& Q1 R, N8 @* ?6 V& h* \1 o5 B9 X
- - O* a: m* z. r6 |
- } t/ B7 I& h. Z
复制代码 ProxyClass.java:, M4 a# O7 N2 c5 H5 t( x8 ?
- import java.lang.reflect.InvocationHandler;
# P$ W$ c; V, k) C - import java.lang.reflect.Method;. m2 c$ Q' j+ W2 }, {/ Y
- import java.lang.reflect.Proxy;
/ r) U" [% R. I9 }+ H5 \ - 7 N8 S* o( H4 t
- 6 \* S* \& x+ z5 k- s x
- public class ProxyClass implements InvocationHandler {
; H5 {4 p/ y3 R) Y. n9 C - Object obj;
$ e! O" C& [& h2 V - /**
; b3 h" l% U, ]/ ^ - * 用于生成代理类
; ]# a& F5 ]7 [ - * @param obj 被代理类对象
* H% B! V- L' G3 y) y# f# D; s% _4 { - * @return 一个代理类
8 B6 q4 C! }3 j# K6 m1 _! g7 j) N+ J - */
, D8 O2 N% }) j1 D% p5 ~ - public Object blind(Object obj){3 w) C5 f7 l$ k4 p4 d5 c
- this.obj=obj;$ j7 t. d9 ?2 |$ Q$ h: \) ?* Y8 b
- return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), this);5 o1 s1 x! B& t" x
- }6 F' O- H/ i% {& w* I; D9 |
- /**
3 t4 O: O# m3 Z' y$ N0 Q - * 代理类对象调用接口方法时,实质上是返回来调用了该方法
3 q4 B5 t+ F' J+ J. c - */
% j- r! ?1 H( Y' P1 w) ] - @Override
" n$ T' z7 Q' J - public Object invoke(Object arg0, Method arg1, Object[] arg2)( B; ^5 l, M: [. Q o( M
- throws Throwable {
6 V0 Z" G- I: P7 E# B - // TODO Auto-generated method stub3 @7 ]" k( n+ t2 U
- Object returnVal=arg1.invoke(obj, arg2);% T, D" q% |1 `2 Y5 m
- System.out.println("我是代理类");
! B4 H! d& {# p- q2 h - return returnVal;# t# u+ z. F- m% h# K. W
- }
9 t% q. p1 }2 k/ D3 f - 7 u( j; P+ O( h2 {0 b3 P
- }# o2 `+ @9 a1 K: G
复制代码 Test.java:: t, N- w4 P8 @; s9 h- b, w
- /**
7 i) g! h6 H6 P/ R% S0 t6 z - * 一个动态代理的例子
. y* b* L/ j! f; C+ x& A - * @author Administrator
; G0 D$ C& Q% }& R9 c$ ~0 d - *被代理类和代理类有共同的方法,代理类调用方法时,其是实质是调用了InvocationHandler中的invoke方法1 {4 P/ Q8 ^. {( ]
- */( |. n; M9 p2 i+ U5 W
- public class Test {
- z; S1 C1 D h# S1 @
6 e7 L' F1 v6 d& x; e6 u7 @% V- public static void main(String[] args) {
$ a4 e8 w# K7 u* i - // TODO Auto-generated method stub
* `6 T9 C: D6 I$ W; U - MyProxyed proxyed=new MyProxyed();+ }) W s' _& H. `( q. d% G
- ProxyClass proxy=new ProxyClass();: ?0 F+ d! V# E9 _% L
- //这个是真正的代理类
) Y4 f* Q# v: ~: h- L9 {1 x - Object obj=proxy.blind(proxyed);! `: P* E( g: ^& Z/ {
- Common common=(Common)obj;8 k i4 G2 E3 h; e }
- common.action();
' R% v' g! ~9 m y - }& m8 |3 J( h. ]( x! t# {
- " s: [+ b: r2 J3 R5 j
- }
" \2 q' D& i5 D# l7 X
复制代码 0 E! d5 b8 m R1 \% z" G) F
ProxyTest.zip
(5.52 KB, 下载次数: 5)
. K9 s, Z0 i! q8 E; t
* ?" R9 s9 b" G! M3 g+ k. S7 o0 ` |
|