动态代理,作为实现AOP的方式之一,已经得到广泛的应用.本人看了很多书关于动态代理的介绍,基本就是不知所云. 所以最终自己做了一个例子,才感到有点明白,下面是我的代码

(注: 说明同一个包里面的类的类加载器(ClassLoader)是一样的)

package  pear; 

  

// import org.springframework.aop.Advisor; 

// import org.springframework.aop.BeforeAdvice; 

import  java.lang.reflect. *

  

interface  SayInterface {           //  被代理接口 

       
public   void  say(); 

       
public   void  saytwo(); 

}
 

class  Say  implements  SayInterface {     //  被代理的类 

       
public   void  say()

              System.out.println(
"  in say  " ); 

       }
 

       
public   void  saytwo()

              System.out.println(
" in say 2 " ); 

       }
 

}
 

  

class  SayHandler  implements  InvocationHandler {      //  

       
private  Say mysay  =   new  Say();          // 先生成一个"被代理类"的对象 

       
public  Object invoke(Object proxy,Method method,Object[] args) throws  Exception

              System.out.println(
" Before " );     // 方法调用之前输出Before 

           method.invoke(mysay,args);         
// 原来方法在这里才真正被调用 

              
// method.invoke(saytwo,args); 

              System.out.println(
" After " );       // 方法调用之后输出After 

              
return   null

       }
 

}
 

  

public   class  Main 

 
/**
  * 
@param  args
  
*/

 
public   static   void  main(String[] args)  {
  
//  TODO Auto-generated method stub
  SayHandler handler  =   new  SayHandler();
  SayInterface si 
=  (SayInterface)Proxy.newProxyInstance(
    SayInterface.
class .getClassLoader(), new  Class[] {SayInterface. class } ,handler);
/**   SayInterface si = (SayInterface)Proxy.newProxyInstance(
//       handler.getClass().getClassLoader(),handler.say.getClass().getInterfaces(),handler);
  //被代理接口的类加载器,被加载的类,和。。。。
        SayInterface si = (SayInterface)Proxy.newProxyInstance(handler.getClass().getClassLoader(),);   
*/
 
   si.say();
  si.saytwo();
  System.out.println(
" the end. " );
 }
 

}


posted on 2006-06-10 20:46 pear 阅读(1177) 评论(2)  编辑  收藏
Comments

只有注册用户登录后才能发表评论。


网站导航: