论坛首页 入门技术论坛

Proxy dynamic 学习(Webwork2&Struts2 Interceptor Question)

浏览 1886 次
该帖已经被评为新手帖
作者 正文
   发表时间:2007-08-25  
今天在研究Webwork2&Struts2的时候仔细研究了一下Dynamic proxy。
Dynamic proxy在很多的时候都要用到 ,例如 Spring的AOP, Webwork&Struts2的Interceptor,EJB

proxy与dynamic proxy的区别

业务接口:
HelloWorld .java
java 代码
  1. public interface HelloWorld {   
  2.        void sayHelloWorld() ;   
  3. }  


业务接口实现:
HelloWorldImpl .java
java 代码
  1. public class HelloWorldImpl implements HelloWorld {   
  2.        public void sayHelloWorld() {   
  3.              System.out.println("Hello World!");              
  4.        }   
  5. }   
  6.   
dynamic proxy方式的代理:
HelloWorldHandler .java
java 代码
  1. import java.lang.reflect.InvocationHandler;   
  2. import java.lang.reflect.Method;   
  3. public class HelloWorldHandler implements InvocationHandler {   
  4.        //要代理的原始对象   
  5.        private Object objOriginal;   
  6.        /**  
  7.         * 构造函数。  
  8.         * @param obj 要代理的原始对象。  
  9.         */  
  10.        public HelloWorldHandler(Object obj) {   
  11.               this.objOriginal = obj ;   
  12.        }   
  13.        public Object invoke(Object proxy, Method method, Object[] args)   
  14.                      throws Throwable {               
  15.               Object result ;              
  16.         //方法调用之前   
  17.               doBefore(); //仿佛是AOP的影子,呵呵            
  18.         //调用原始对象的方法   
  19.               result = method.invoke(this.objOriginal ,args);   
  20.         //方法调用之后   
  21.               doAfter();       
  22.               return result ;   
  23.        }   
  24.        private void doBefore() {   
  25.               System.out.println("before method invoke!");   
  26.        }   
  27.        private void doAfter() {   
  28.               System.out.println("after method invoke!");   
  29.        }   
  30. }   
proxy方式的代理
HelloWorldProxy .java
java 代码
  1. public class HelloWorldProxy implements HelloWorld {   
  2.        //要代理的原始对象   
  3.        private HelloWorldImpl objImpl   
  4.        /**  
  5.         * 构造函数。  
  6.         * @param obj 要代理的原始对象。  
  7.         */  
  8.        public HelloWorldHandlerHelloWorldImpl objImpl{   
  9.               this.objImpl= objImpl;   
  10.        }   
  11.        public void sayHelloWorld() {   
  12.              System.out.println("In the Proxy Class!");    
  13.              objImpl.sayHelloWorld();   
  14.           System.out.println("In the Proxy Class!");   
  15.        }     
  16. }  
dynamic proxy方式测试代码:
Test .java
java 代码
  1. import java.lang.reflect.InvocationHandler;   
  2. import java.lang.reflect.Proxy;   
  3. public class Test {   
  4.        public static void main(String[] args) {   
  5.               HelloWorld hw = new HelloWorldImpl();           
  6.               InvocationHandler handler = new HelloWorldHandler(hw);          
  7.               HelloWorld proxy = (HelloWorld) Proxy.newProxyInstance(   
  8.                             hw.getClass().getClassLoader(),   
  9.                             hw.getClass().getInterfaces(),   
  10.                             handler);   
  11.               proxy.sayHelloWorld();   
  12.        }   
  13. }  
Notice:newProxyInstance传递的是一个接口对象。否则会报错
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics