随笔-57  评论-202  文章-17  trackbacks-0
      在JDK1.3版本中引入了Dynamic Proxy的代理机制,通过实现java.lang.reflect.InvocationHandler接口,可以实现拦截需要改写的方法。下面是一个简单范例。
      有下面一个接口TestInterface和它的一个实现TestImpl:

package sample.proxy;

/**
 * <p>Title: </p>
 *
 * <p>Description: </p>
 *
 * <p>Copyright: Copyright (c) 2005</p>
 *
 * <p>Company: </p>
 *
 * @author George Hill
 * @version 1.0
 
*/


public interface TestInterface {

  
public String print();

}


package sample.proxy;

/**
 * <p>Title: </p>
 *
 * <p>Description: </p>
 *
 * <p>Copyright: Copyright (c) 2005</p>
 *
 * <p>Company: </p>
 *
 * @author George Hill
 * @version 1.0
 
*/


public class TestImpl implements TestInterface {
  
  
public String print() {
    
return "Hello, it's from TestImpl class";
  }

  
}


      下面拦截print方法,调用自己的实现,这需要实现java.lang.reflect.InvocationHandler接口。

package sample.proxy;

import java.lang.reflect.
*;

/**
 * <p>Title: </p>
 *
 * <p>Description: </p>
 *
 * <p>Copyright: Copyright (c) 2005</p>
 *
 * <p>Company: </p>
 *
 * @author George Hill
 * @version 1.0
 
*/


public class TestHandler implements InvocationHandler {
  
  TestInterface test;
  
  
/**
   * 将动态代理绑定到指定的TestInterface
   * @param test TestInterface
   * @return TestInterface 绑定代理后的TestInterface
   
*/

  
public TestInterface bind(TestInterface test) {
    
this.test = test;
    
    TestInterface proxyTest 
= (TestInterface) Proxy.newProxyInstance(
      test.getClass().getClassLoader(), test.getClass().getInterfaces(), 
this);
    
    
return proxyTest;
  }

  
  
/**
   * 方法调用拦截器,拦截print方法
   * @param proxy Object
   * @param method Method
   * @param args Object[]
   * @return Object
   * @throws Throwable
   
*/

  
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    
// 如果调用的是print方法,则替换掉
    if ("print".equals(method.getName())) {
      
return "HaHa, It's come from TestHandler";
    }
 else {
      
return method.invoke(this.test, args);
    }

  }

  
}


      下面是测试用例:

package sample.test;

import junit.framework.
*;

import sample.proxy.
*;

/**
 * <p>Title: </p> 
 * 
 * <p>Description: </p> 
 * 
 * <p>Copyright: Copyright (c) 2005</p> 
 * 
 * <p>Company: </p>
 * 
 * @author George Hill
 * @version 1.0
 
*/


public class TestDynamicProxy extends TestCase {
  
  
private TestInterface test = null;

  
protected void setUp() throws Exception {
    super.setUp();
    TestHandler handler 
= new TestHandler();
    
// 用handler去生成实例
    test = handler.bind(new TestImpl());
  }


  
protected void tearDown() throws Exception {
    test 
= null;
    super.tearDown();
  }


  
public void testPrint() {
    System.
out.println(test.print());
  }


}


      运行测试用例,可以看到输出的是“HaHa, It's come from TestHandler”。
posted on 2005-05-24 17:47 小米 阅读(3486) 评论(3)  编辑  收藏 所属分类: Java

评论:
# re: JDK Dynamic Proxy模式的简单范例 2005-10-20 13:10 | 鸟不生蛋蛋的地方
if ("print".equals(method.getName())) {
return "HaHa, It's come from TestHandler";
} else {
return method.invoke(this.test, args);

为什么这里的返回改成return method.invoke(proxy, args);就不行,这两个应该应用同一个对象吧,请教
  回复  更多评论
  
# re: JDK Dynamic Proxy模式的简单范例 2005-12-08 11:11 | 寂寞邀请
操作顺序 client->proxy->this.test->实际的操作

换成return method.invoke(proxy, args),就死循环了。

client->proxy->proxy->proxy...........  回复  更多评论
  
# re: JDK Dynamic Proxy模式的简单范例[未登录] 2011-06-20 17:40 | fox
简单,明了  回复  更多评论
  

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


网站导航: