TA的每日心情 | 衰 2021-2-2 11:21 |
---|
签到天数: 36 天 [LV.5]常住居民I
|
Common.java:2 J- V0 t8 s) L/ v& Q
- , o$ D) l; t# a, z
- public interface Common {; t+ o7 z7 r5 {. S. {
: c" Y" u0 M+ F$ F% l; ]9 X- public void action();; N4 ?2 [6 }; ^* \9 L6 _
- }
( o, ?+ `0 J2 z y& B, N
复制代码
* ^# E2 A# X% YMyProxyed.java:
4 T! n' y- i) N2 s- /**8 v& g) v2 d8 j4 Q3 p6 ~$ x( f4 l
- * 被代理类
5 Q7 Y( N' V/ _$ D. Y& r - * @author Administrator( p& S# n4 I! v; U4 ^4 l$ {+ W# y
- *) o2 K( M4 J G0 H; v
- */
2 s5 m* B" J( U' T - public class MyProxyed implements Common{
3 k' A" c- q4 l: S - * B* N9 M) v1 U2 ?; }
- public MyProxyed(){* G# P7 O4 M) R( b( R6 i/ Z
- ( e0 s% ]: b8 H& W. B! K7 o9 z! W
- }
. F# u) K: ?% f2 N - @Override5 x' \1 {1 u& B5 ~5 G7 H% a
- public void action() {/ b9 r3 S% M. B) E0 s
- // TODO Auto-generated method stub
I& T( p2 R0 X7 g2 j: L! c# H& P - System.out.println("我是被代理类,别忘了我。。。。");
+ |9 ^8 G" M6 u' k; R! W: p - }6 j6 z) [- @- n F
- , G; a4 H) L, u( u; G
- }
, c/ V" d( C6 s) o* \
复制代码 ProxyClass.java: b* C' @% a* Y. o
- import java.lang.reflect.InvocationHandler;
, d0 K: |2 o" r+ j' { - import java.lang.reflect.Method;
6 F0 k! v" Z! r% ]: g - import java.lang.reflect.Proxy;
% m: b. [' K: X: @
6 T$ R1 p! { e0 K% X+ a8 m- # g( O1 a+ H {" B* s0 z
- public class ProxyClass implements InvocationHandler {9 ]+ X6 k4 i0 u
- Object obj;
8 {; E1 W* u2 i* Z: e - /**
4 Y, Z( Y# k& q! o3 M6 \+ @. N - * 用于生成代理类
4 @9 e& B4 j& ~ - * @param obj 被代理类对象
! U7 R9 @, j7 k - * @return 一个代理类
" u8 L0 ~" Q9 b$ i# v3 P. ` - */
* d* h1 k1 Z. o& u9 o- G - public Object blind(Object obj){
7 _$ U6 J1 B# k& K - this.obj=obj;. ?/ O7 G) W% C0 ]5 h& Z( G
- return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), this);
/ t& d; }9 J% r- L# o - }* u7 @+ v; z7 B* l3 }! ]
- /**
, G) e, o- T: ]; \ - * 代理类对象调用接口方法时,实质上是返回来调用了该方法/ B+ P5 h, G z3 k0 D8 l2 ]0 o
- */
& j3 ^4 ~. G; u$ N1 o - @Override
& P2 q0 X" t, W4 j3 e& R& W - public Object invoke(Object arg0, Method arg1, Object[] arg2)+ ]1 z/ H3 d& T" C0 ^
- throws Throwable {4 @' ^6 t4 d) i6 R; u, z
- // TODO Auto-generated method stub: _0 a5 D) F2 U4 a
- Object returnVal=arg1.invoke(obj, arg2);
9 N* a8 j# {$ K/ g3 E1 E2 a - System.out.println("我是代理类");
/ z7 a9 I9 w' }. l - return returnVal;- w* X$ l3 Y. s. p4 {3 i
- }& \4 [$ D" Q; c5 W
- 3 {' K S+ s4 ^- t
- }
: C2 p+ J0 E a n- w( B8 p, I
复制代码 Test.java:
" e% d2 r; C, r6 a, d% A- /**
, s) g* v+ m/ L& P - * 一个动态代理的例子
1 E8 _1 z0 C9 O( t' K) C - * @author Administrator
8 @& o, o& b& L8 h$ J; p; \% f - *被代理类和代理类有共同的方法,代理类调用方法时,其是实质是调用了InvocationHandler中的invoke方法
* M$ h' g* k; T - */2 x8 W1 ^7 E- D( d6 i7 Z
- public class Test {6 G! G! N# Y7 O5 a3 ]' R8 C
- ' Y, L* E& V) f- u& T# s
- public static void main(String[] args) {3 D7 }+ p7 P" K9 C& Y X
- // TODO Auto-generated method stub
3 f" |5 Y/ Q" } - MyProxyed proxyed=new MyProxyed();3 @1 F3 d7 }0 S7 R ?9 A4 w" M
- ProxyClass proxy=new ProxyClass();
: `" c& @3 [ ]" `5 O% r& _; u' p - //这个是真正的代理类" O5 v2 H8 ?5 i% V- N4 I }
- Object obj=proxy.blind(proxyed);
, v1 N, U# m% U6 o2 W - Common common=(Common)obj;% [: M$ L, j2 {
- common.action();- v1 m6 x3 u9 N0 M8 k" v3 Q( O U
- }* u4 C6 K9 z* m/ Q% f
6 B1 f* F$ k( i5 T' U5 {: W' n- }6 U% k1 I5 L) C3 ]. m7 F: i: R
复制代码 ( V5 k: t8 {( i0 b
ProxyTest.zip
(5.52 KB, 下载次数: 5)
0 D/ U3 Q& C8 W5 W% [: C" n ^, i4 B9 P, B# R+ J9 m
|
|