简单的描述JDK的动态代理实现调用拦截器中的方法(从李刚老师的<<struts2.0权威指南>>中学到)
1.JDK能对实现了接口的实例来生成代理,因此首先创建一个接口.
- package cn.edu.hld;
- public interface Person
- {
- public void info() ;
- public void run() ;
- }
2.为了在后面实现动态代理,因此提供一个Person接口的实现类.
- package cn.edu.hld;
- public class PersonImpl implements Person
- {
- public void info()
- {
-
- System.out.println("我是thtwin") ;
- }
- public void run()
- {
-
- System.out.println("我想跑得快一些!");
- }
- }
3.实现核心的拦截器类当某个方法被调用之前或之后执行相应的拦截器的方法.至于要拦截哪一个对象,则需通过后面的操作来体现.
- package cn.edu.hld;
- public class PersonIntercepter
- {
- public void method1()
- {
- System.out.println("method_1被执行了!") ;
- }
- public void method2()
- {
- System.out.println("method_2被执行了!") ;
- }
- }
4.为了让拦截器知道其要拦截的目标对象,以及其应执行的方法,则应该创建一个类,该类实现一个JDK反射体系里的接口InvocationHandler.
- package cn.edu.hld;
- import java.lang.reflect.InvocationHandler;
- import java.lang.reflect.Method;
- public class ProxyHandler implements InvocationHandler
- {
- private Object target ;
- private PersonIntercepter pi = new PersonIntercepter() ;
- public Object invoke(Object proxy, Method method, Object[] args)
- throws Throwable
- {
- Object result = null ;
- if(method.getName().equals("info"))
- {
- pi.method1() ;
- result = method.invoke(target, args) ;
- pi.method2() ;
- }
- else
- {
- result = method.invoke(target, args) ;
- }
- return result;
- }
- public void setTarget(Object target)
- {
- this.target = target;
- }
- }
5.为了根据目标对象生成一个代理对象,还应该创建一个代理工厂.
- package cn.edu.hld;
- import java.lang.reflect.Proxy;
- public class MyProxyFactory
- {
- public static Object getProxy(Object target)
- {
- ProxyHandler handler = new ProxyHandler() ;
- handler.setTarget(target) ;
- return Proxy.newProxyInstance(PersonImpl.class.getClassLoader()
- ,target.getClass().getInterfaces(),handler) ;
- }
- }
6.主程序的实现.
- package cn.edu.hld;
- public class TestPerson
- {
- public static void main(String args[])
- {
- Person targetPerson = new PersonImpl() ;
- Person person = null ;
- Object proxy = MyProxyFactory.getProxy(targetPerson) ;
- if(proxy instanceof Person)
- {
- person = (Person)proxy ;
- }
- person.info() ;
- person.run() ;
- }
- }
7.直接在MyEclipse中运行.得到结果如下:
- method_1被执行了!
- 我是thtwin
- method_2被执行了!
- 我想跑得快一些!