我的日常

登录/注册
您现在的位置:论坛 盖世程序员(我猜到了开头 却没有猜到结局) 盖世程序员 > java动态代理基本实现案例
总共48087条微博

动态微博

查看: 1089|回复: 0

java动态代理基本实现案例

[复制链接]
admin    

1244

主题

544

听众

1万

金钱

管理员

  • TA的每日心情

    2021-2-2 11:21
  • 签到天数: 36 天

    [LV.5]常住居民I

    管理员

    跳转到指定楼层
    楼主
    发表于 2015-05-17 20:12:16 |只看该作者 |倒序浏览
    Common.java: P) ]% W! x# R+ Z8 o" J; n- S
    1. 7 l! Y& k9 I8 D! |
    2. public interface Common {
      2 z! o& Y) `% U( E8 }

    3. 2 W# q9 k& G" V& ^/ Z! F3 [( n; t
    4.         public void action();; I) }- e+ g2 @7 N9 G" p2 @6 n5 B, s
    5. }
      8 ~  |* S8 K* [& q0 w
    复制代码
    ; Z8 w, l1 s3 J1 [6 R
    MyProxyed.java:
    8 b; C9 F% \4 h$ A8 J; F
    1. /**
      4 m6 b1 `/ G. {1 W; @3 D  o
    2. * 被代理类
      & ]" p" I, ?* \" A7 f
    3. * @author Administrator
      - i; Z0 ?, V+ A( \
    4. *
        w6 k8 X; r1 M! c3 s$ s% }5 Z
    5. */
      ! u1 b/ I% x4 x' R4 m$ L; S9 e
    6. public class MyProxyed implements Common{! h6 f) d" I% w1 P. c8 I4 n8 C
    7. ( d9 z1 F" {9 y1 W
    8.         public MyProxyed(){7 }6 R) D" ]4 q7 }- f" I% O
    9.                 # ]( Z3 r' e! i) h
    10.         }
      , Q. S' X# Y+ y( T, E0 L
    11.         @Override
      ( s$ O1 y( z( d/ Y9 x
    12.         public void action() {
      / w" X0 }- @; b0 Y" |8 s% i* o
    13.                 // TODO Auto-generated method stub6 U0 z1 s1 c: v. f0 Z: L. R) u5 M
    14.                 System.out.println("我是被代理类,别忘了我。。。。");
      + y$ N: T' P( f1 i6 d( O
    15.         }
      ) m! ?8 X$ O4 l0 Q9 c5 r- V  Z0 o

    16. ( C2 N3 d% v' {' \$ p& Y
    17. }& U' H# X- G; d
    复制代码
    ProxyClass.java:
    7 x% ]3 ~3 ~& R5 T& b
    1. import java.lang.reflect.InvocationHandler;) Y" v/ Q) ]- m2 U0 F# b# t/ ~; `; O) H
    2. import java.lang.reflect.Method;
      4 H  |3 f  Y! Z$ L0 h
    3. import java.lang.reflect.Proxy;
      8 ?5 R3 a0 a9 `" i$ V" r
    4. . u7 a) j! A5 c* F5 N8 s3 ~$ @& s

    5. 4 h. \+ B; m9 i9 t- [9 O
    6. public class ProxyClass implements InvocationHandler {$ o( F+ ~4 ?) {* Z: W
    7.         Object obj;& k/ q7 G& A' F# n9 K2 a
    8.         /**8 b0 M' p% j# U+ H/ T. k
    9.          * 用于生成代理类
      4 [! D+ R4 V6 ^+ _3 F9 X% t
    10.          * @param obj  被代理类对象3 [! g# F' X6 D7 |. J4 N( [+ J
    11.          * @return     一个代理类
      % f) K7 w" C  z! q% _+ W6 x: m
    12.          */
        r2 z( o. R, R8 l$ [" t. Z
    13.         public Object blind(Object obj){- W- W( J8 I9 o! [& e0 K
    14.                 this.obj=obj;; B- |0 s$ Q6 \  X0 [, Q
    15.                 return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), this);
      5 n( z2 i7 k& ~9 m, _, G' R
    16.         }
      3 x  a3 {& |* L( o' O0 L9 j8 l
    17.         /**0 ~: {& M3 r: H: p
    18.          * 代理类对象调用接口方法时,实质上是返回来调用了该方法; d5 S! X6 n, F; H7 E
    19.          */0 r; r3 }. m1 u: k/ f
    20.         @Override
      & I- k6 R2 e, R+ {
    21.         public Object invoke(Object arg0, Method arg1, Object[] arg2)7 l$ v- O. }- h, Z6 b0 [
    22.                         throws Throwable {
      . W7 T$ Y6 Y+ M* i, t% x
    23.                 // TODO Auto-generated method stub6 ^: T: V+ L0 ?2 I+ O- d
    24.                 Object returnVal=arg1.invoke(obj, arg2);4 k/ w$ W2 N& N" N5 ]# V  ~9 `( `
    25.                 System.out.println("我是代理类");2 d$ S! a0 f! o- z9 B' Z
    26.                 return returnVal;
      5 W! l/ _5 }% Q
    27.         }3 a) Q+ I( C6 u/ e7 v

    28. 0 V# ]7 j3 ^4 ~- K" m- G
    29. }
      $ C0 q! C# k! w- a1 v
    复制代码
    Test.java:9 j, N% \" c$ l, W9 q% }
    1. /**
      0 o  q; p0 q0 l! H7 _
    2. * 一个动态代理的例子0 ^" U; V; V/ C0 z* M# l
    3. * @author Administrator) n( b( U& j+ J
    4. *被代理类和代理类有共同的方法,代理类调用方法时,其是实质是调用了InvocationHandler中的invoke方法
      - |  l& B' t" G) w  z
    5. */
      8 _/ [5 R, ?) |2 j  W- Z
    6. public class Test {
      * a5 o3 X! c" w" P

    7. 6 a0 |8 e; A# n2 E0 I
    8.         public static void main(String[] args) {
      ( \. _, N5 N( A$ L5 q
    9.                 // TODO Auto-generated method stub( N3 Q* q3 F' M* t* Y) o
    10.                 MyProxyed proxyed=new MyProxyed();
      : Y/ a2 Q6 p6 ~/ Y
    11.                 ProxyClass proxy=new ProxyClass();
      : h, T, u% b% x. z3 l
    12.                 //这个是真正的代理类
      + @% Z# u. b8 }: O: R  T
    13.                 Object obj=proxy.blind(proxyed);
      8 C# F3 s% B; t2 A8 H, @6 f! `
    14.                 Common common=(Common)obj;
      - |) h  ]3 B5 B8 f2 r: M: ]1 n
    15.                 common.action();
      * d( s( {2 I& _% X0 Q+ B. F
    16.         }1 f) w$ }; C* ~/ q7 k+ B$ ^4 y8 I
    17. 0 O- x. ~2 b, R0 T$ ^+ U& @
    18. }8 M  ]* q0 m2 A% H6 y5 A  g: c8 h
    复制代码
    - g, C  p# i6 V$ |
    ProxyTest.zip (5.52 KB, 下载次数: 5)
    ) a% n* y+ J! q0 e
    ' ^4 H' Y2 ]8 M1 F. j0 o5 H

    科帮网 1、本主题所有言论和图片纯属会员个人意见,与本社区立场无关
    2、本站所有主题由该帖子作者发表,该帖子作者与科帮网享有帖子相关版权
    3、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和科帮网的同意
    4、帖子作者须承担一切因本文发表而直接或间接导致的民事或刑事法律责任
    5、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责
    6、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意
    7、科帮网管理员和版主有权不事先通知发贴者而删除本文


    JAVA爱好者①群:JAVA爱好者① JAVA爱好者②群:JAVA爱好者② JAVA爱好者③ : JAVA爱好者③

    快速回复
    您需要登录后才可以回帖 登录 | 立即注册

       

    关闭

    站长推荐上一条 /1 下一条

    发布主题 快速回复 返回列表 联系我们 官方QQ群 科帮网手机客户端
    快速回复 返回顶部 返回列表