JDK的动态代理实现调用拦截器中的方法

本文介绍如何使用JDK动态代理实现方法调用的拦截。通过创建接口、实现类及拦截器,结合InvocationHandler接口和Proxy类,实现了在方法调用前后执行特定操作的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简单的描述JDK的动态代理实现调用拦截器中的方法(从李刚老师的<<struts2.0权威指南>>中学到)

1.JDK能对实现了接口的实例来生成代理,因此首先创建一个接口.

  1. //interface person
  2. package cn.edu.hld;
  3. public interface Person
  4. {
  5.     public void info() ;
  6.     public void run() ;
  7. }

2.为了在后面实现动态代理,因此提供一个Person接口的实现类.

  1. //类PersonImpl .java
  2. package cn.edu.hld;
  3. public class PersonImpl implements Person
  4. {
  5.     public void info()
  6.     {
  7.         // TODO Auto-generated method stub
  8.         System.out.println("我是thtwin") ;
  9.     }
  10.     public void run()
  11.     {   
  12.         // TODO Auto-generated method stub
  13.         System.out.println("我想跑得快一些!");
  14.     }
  15. }

3.实现核心的拦截器类当某个方法被调用之前或之后执行相应的拦截器的方法.至于要拦截哪一个对象,则需通过后面的操作来体现.

  1. //PersonIntercepter.java
  2. package cn.edu.hld;
  3. public class PersonIntercepter
  4. {
  5.     public void method1()
  6.     {
  7.         System.out.println("method_1被执行了!") ;
  8.     }
  9.     public void method2()
  10.     {
  11.         System.out.println("method_2被执行了!") ;
  12.     }
  13. }

4.为了让拦截器知道其要拦截的目标对象,以及其应执行的方法,则应该创建一个类,该类实现一个JDK反射体系里的接口InvocationHandler.

  1. //ProxyHandler .java
  2. package cn.edu.hld;
  3. import java.lang.reflect.InvocationHandler;
  4. import java.lang.reflect.Method;
  5. public class ProxyHandler implements InvocationHandler
  6. {
  7.     private Object target  ;
  8.     private PersonIntercepter pi = new PersonIntercepter() ;
  9.     public Object invoke(Object proxy, Method method, Object[] args)
  10.             throws Throwable
  11.     {
  12.         Object result = null ;
  13.         if(method.getName().equals("info"))
  14.         {
  15.             pi.method1() ;
  16.             result = method.invoke(target, args) ;
  17.             pi.method2() ;
  18.         }
  19.         else
  20.         {
  21.             result = method.invoke(target, args) ;
  22.         }
  23.         return result;
  24.     }
  25.     public void setTarget(Object target)
  26.     {
  27.         this.target = target;
  28.     }
  29. }

5.为了根据目标对象生成一个代理对象,还应该创建一个代理工厂.

  1. //MyProxyFactory.java
  2. package cn.edu.hld;
  3. import java.lang.reflect.Proxy;
  4. public class MyProxyFactory
  5. {
  6.     public static Object getProxy(Object target)
  7.     {
  8.         ProxyHandler handler = new ProxyHandler() ;
  9.         handler.setTarget(target) ;
  10.         return Proxy.newProxyInstance(PersonImpl.class.getClassLoader()
  11.                 ,target.getClass().getInterfaces(),handler) ;
  12.     }
  13. }

6.主程序的实现.

  1. //TestPerson.java
  2. package cn.edu.hld;
  3. public class TestPerson
  4. {   
  5.     public static void main(String args[])
  6.     {
  7.         Person targetPerson = new PersonImpl() ;
  8.         Person person = null ;
  9.         Object proxy = MyProxyFactory.getProxy(targetPerson) ;
  10.         if(proxy instanceof Person)
  11.         {
  12.             person = (Person)proxy ;
  13.         }
  14.         person.info() ;
  15.         person.run() ;
  16.     }
  17. }

7.直接在MyEclipse中运行.得到结果如下:

  1. method_1被执行了!
  2. 我是thtwin
  3. method_2被执行了!
  4. 我想跑得快一些!

 

 

 

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值