java动态代理例子


 1
  先看一个简单点动态代理的例子(没有用到factory)
 2  1  定义接口
 3  package  com.dynamic.simple;
 4 
 5  import  com.dynamic.simple.Subject;
 6 
 7  public   interface  Subject{   
 8       public   void  request();   
 9  }  
10 
11  2  实现真实类
12  package  com.dynamic.simple;
13 
14  public   class  RealSubject  implements  Subject{    
15       public  RealSubject(){}    
16       public   void  request() {
17          System.out.println( " From real subject. " );    
18      }    
19  }   
20 
21  3  定义动态代理
22  package  com.dynamic.simple;
23 
24  import  java.lang.reflect.Method;    
25  import  java.lang.reflect.InvocationHandler;    
26  public   class  DynamicSubject  implements  InvocationHandler {    
27       private  Object sub;    
28      
29       public  DynamicSubject() {    
30      }    
31      
32       public  DynamicSubject(Object obj) {    
33          sub  =  obj;    
34      }    
35      
36       public  Object invoke(Object proxy, Method method, Object[] args)  throws  Throwable {    
37          System.out.println( " before calling  "   +  method);    
38          method.invoke(sub,args);    
39          System.out.println( " after calling  "   +  method);    
40           return   null ;    
41      }    
42  }  
43 
44  4  客户端
45  package  com.dynamic.simple;
46 
47  import  java.lang.reflect.InvocationHandler;    
48  import  java.lang.reflect.Proxy;    
49 
50  public   class  Client{    
51       static   public   void  main(String[] args)  throws  Throwable{    
52          RealSubject rs  =   new  RealSubject();  // 在这里指定被代理类    
53          InvocationHandler ds  =   new  DynamicSubject(rs);  // 初始化代理类    
54          Class cls  =  rs.getClass();    
55          Subject subject  =  (Subject) Proxy.newProxyInstance(cls.getClassLoader(), cls.getInterfaces(),ds );    
56          subject.request();    
57      }   
58  }

 

运行客户端结果为:

before calling public abstract void com.dynamic.simple.Subject.request()
From real subject.
after calling public abstract void com.dynamic.simple.Subject.request()

 

 

  1  下面看一个复杂点的动态代理实现(用到了factory)
  2  1  定义接口
  3  package  com.proxy;
  4 
  5  import  com.proxy.SomeClass;
  6  import  com.proxy.SomeClassImpl;
  7 
  8  public   interface  SomeClass {
  9       public   void  someMethod();
 10      
 11       public   void  someOtherMethod( final  String text);
 12  }
 13 
 14  2  定义实现类
 15  package  com.proxy;
 16 
 17 
 18  public   class  SomeClassImpl  implements  SomeClass{
 19       private  String name;
 20      
 21       public  SomeClassImpl( final  String name){
 22           this .name  =  name;
 23      }
 24      
 25       public   void  someMethod(){
 26          System.out.println( this .name);
 27      }
 28      
 29       public   void  someOtherMethod( final  String text){
 30          System.out.println(text);
 31      }
 32  }
 33 
 34  3  定义2个代理SomeClassProxy和SomeClassCountingProxy(静态代理时才需要)
 35  /* SomeClassProxy */
 36  package  com.proxy;
 37 
 38 
 39  public   class  SomeClassProxy  implements  SomeClass{
 40      
 41       private   final  SomeClassImpl impl;
 42      
 43       public  SomeClassProxy(SomeClassImpl impl){
 44           this .impl  =  impl;
 45      }
 46      
 47       public   void  someMethod(){
 48           this .impl.someMethod();
 49      }
 50      
 51       public   void  someOtherMethod( final  String text){
 52           this .impl.someOtherMethod(text);
 53      }
 54  }
 55 
 56  /* SomeClassCountingProxy */
 57  package  com.proxy;
 58 
 59 
 60  public   class  SomeClassCountingProxy  implements  SomeClass{
 61       private   final  SomeClassImpl impl;
 62      
 63       private   int  invocationCount  =   0 ;
 64      
 65       public  SomeClassCountingProxy(SomeClassImpl impl){
 66           this .impl  =  impl;
 67      }
 68      
 69       public   void  someMethod(){
 70           this .invocationCount  ++ ;
 71           this .impl.someMethod();
 72      }
 73      
 74       public   void  someOtherMethod( final  String text){
 75           this .invocationCount  ++ ;
 76           this .impl.someOtherMethod(text);
 77      }
 78 
 79       public   int  getInvocationCount() {
 80           return  invocationCount;
 81      }
 82 
 83       public   void  setInvocationCount( int  invocationCount) {
 84           this .invocationCount  =  invocationCount;
 85      }
 86  }
 87 
 88  4  定义工厂
 89  package  com.proxy;
 90 
 91  import  java.lang.reflect.InvocationHandler;
 92  import  java.lang.reflect.Proxy;
 93 
 94 
 95  public   class  SomeClassFactory {
 96       /* //static proxy
 97      public static final SomeClass getStaticSomeClassProxy(){
 98          SomeClassImpl impl = new SomeClassImpl(System.getProperty("user.name"));
 99          if (false) {//generally when debuging
100              return new SomeClassCountingProxy(impl);
101          } else {
102              return new SomeClassProxy(impl);
103          }
104      }
105       */
106      
107       // dynamic proxy
108       public   static   final  SomeClass getDynamicSomeClassProxy(){
109          SomeClassImpl impl  =   new  SomeClassImpl(System.getProperty( " user.name " ));
110          ClassLoader loader  =  SomeClassImpl. class .getClassLoader();
111          Class[] interfaces  =   new  Class[] {SomeClass. class };
112          InvocationHandler handler  =   new  MethodCountingHandler(impl);
113          SomeClass proxy  =  (SomeClass)Proxy.newProxyInstance(loader, interfaces, handler);
114           return  proxy;
115      }
116  }
117 
118  5  定义InvocationHandler,主要通过这个类实现动态代理功能及其扩展
119  package  com.proxy;
120 
121  import  java.lang.reflect.InvocationTargetException;
122  import  java.lang.reflect.InvocationHandler;
123  import  java.lang.reflect.Method;
124 
125 
126  public   class  MethodCountingHandler  implements  InvocationHandler{
127 
128       private   final  Object impl;
129       private   int  invocationCount  =   0 ;
130      
131       public  MethodCountingHandler( final  Object impl){
132           this .impl  =  impl;
133      }
134      
135       public   int  getInvocationCount(){
136           return  invocationCount;
137      }
138      
139      @Override
140       public  Object invoke(Object proxy, Method method, Object[] args)
141               throws  Throwable {
142           try  {
143               this .invocationCount ++ ;
144              Object result  =  method.invoke(impl, args);
145               return  result;
146          }  catch  ( final  InvocationTargetException e) {
147               throw  e.getTargetException();
148          }
149      }
150  }
151 
152 
153  6  定义客户端
154  package  com.proxy;
155 
156  import  java.lang.reflect.InvocationHandler;
157  import  java.lang.reflect.Proxy;
158 
159 
160  public   class  DemoDynamic {
161 
162       /**
163       *  @param  args
164        */
165       public   static   void  main(String[] args) {
166           /* //no use factory
167          SomeClassImpl real = new SomeClassImpl(System.getProperty("user.name"));
168          InvocationHandler dynamic = new MethodCountingHandler(real);
169          Class clz = real.getClass();
170          SomeClass obj = (SomeClass)Proxy.newProxyInstance(clz.getClassLoader(), clz.getInterfaces(), dynamic);
171          obj.someMethod();
172          obj.someOtherMethod("test");
173           */
174          
175           // use factory to get a real object
176          SomeClass obj  =  (SomeClass)SomeClassFactory.getDynamicSomeClassProxy();
177          obj.someMethod();
178          obj.someOtherMethod( " test " );
179          
180           // the invocationhandler works as proxy function, extend the function of real object
181          InvocationHandler handler  =  Proxy.getInvocationHandler(obj);
182           if  (handler  instanceof  MethodCountingHandler) {
183              System.out.println(((MethodCountingHandler)handler).getInvocationCount());
184          }
185      }
186  }

运行结果为:

Administrator
test
2

 

参照链接:

http://blog.csdn.net/goodluckforlove/archive/2009/10/13/4663079.aspx 

转载于:https://www.cnblogs.com/kelin1314/archive/2011/03/04/1970899.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值