java 动态代理范例 InvocationHandler与Proxy

java 动态代理范例 InvocationHandler与Proxy,拦截与代理

  (2011-04-22 19:19:23)
标签: 

接口

 

helloworld

 

代理

 

it

分类: 技术引用

java.lang.reflect.Proxy,
Proxy 提供用于创建动态代理类和实例的静态方法.
newProxyInstance()
返回一个指定接口的代理类实例,该接口可以将方法调用指派到指定的调用处理程序
(详见api文档)

java.lang.reflect.InvocationHandler,
InvocationHandler 是代理实例的调用处理程序 实现的接口。
invoke()
在代理实例上处理方法调用并返回结果。在与方法关联的代理实例上调用方法时,将在调用处理程序上

调用此方法。

 http://www.51testing.com/?uid-202848-action-viewspace-itemid-229928

 

JDK1.2以后提供了动态代理的支持,程序员通过实现java.lang.reflect.InvocationHandler接口提供一个拦截处理器,然后通过java.lang.reflect.Proxy得到一个代理对象,通过这个代理对象来执行商业方法,在商业方法被调用的同时,执行处理器会被自动调用。    

 

Java动态代理只能对实现了接口的类生成代理,不能针对类。其实现主要是通过java.lang.reflect.Proxy类和java.lang.reflect.InvocationHandler接口。Proxy类主要用来获取动态代理对象,InvocationHandler接口用来约束调用者实现。

 

     接口类源代码:

Java代码
  1. public interface HelloWorld {   
  2.     public void sayHelloWorld();   
  3.  

 

     实现类源代码:

Java代码
  1. public class HelloWorldImpl implements HelloWorld {   
  2.     public void sayHelloWorld() {   
  3.         System.out.println("Hello World!");   
  4.     }   
  5.  

 

     拦截器源代码:

Java代码
  1. public class HelloWorldHandler implements InvocationHandler {   
  2.     //目标对象  
  3.     private Object targetObject;   
  4.        
  5.     public HelloWorldHandler(Object targetObject){   
  6.         this.targetObject targetObject;   
  7.     }   
  8.        
  9.     public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {   
  10.         System.out.println("方法调用前。。。");   
  11.   
  12.         Object result method.invoke(this.targetObject, args);   
  13.   
  14.         System.out.println("方法调用结束");   
  15.            
  16.         return result;   
  17.     }   
  18.  

 

     测试代码:

Java代码
  1. public class HelloWorldTest {   
  2.     public static void main(String[] args) {   
  3.         //业务对象  
  4.         HelloWorld obj new HelloWorldImpl();   
  5.            
  6.         //拦截器对象  
  7.         HelloWorldHandler handler new HelloWorldHandler(obj);   
  8.            
  9.         //返回业务对象的代理对象  
  10.         HelloWorld proxy (HelloWorld)Proxy.newProxyInstance(   
  11.                 obj.getClass().getClassLoader(),    
  12.                 obj.getClass().getInterfaces(),    
  13.                 handler);   
  14.            
  15.         //通过代理对象执行业务对象的方法  
  16.         proxy.sayHelloWorld();   
  17.     }   
  18.  

 

     测试结果:

Html代码
  1. 方法调用前。。。   
  2. Hello World!   
  3. 方法调用结束  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值