JDK實現(xiàn)調用攔截器淺析
JDK實現(xiàn)動態(tài)代理調用攔截器中的方法的過程是什么呢?
JDK實現(xiàn)調用攔截器之一:
實現(xiàn)接口的實例來生成代理,因此創(chuàng)建一個接口
interface person
- package cn.edu.hld;
 - public interface Person
 - {
 - public void info() ;
 - public void run() ;
 - }
 
JDK實現(xiàn)調用攔截器之二:
提供一個Person接口的實現(xiàn)類.
類PersonImpl .java
- package cn.edu.hld;
 - public class PersonImpl implements Person
 - {
 - public void info()
 - {
 - // TODO Auto-generated method stub
 - System.out.println("我是thtwin") ;
 - }
 - public void run()
 - {
 - // TODO Auto-generated method stub
 - System.out.println("我想跑得快一些!");
 - }
 - }
 
JDK實現(xiàn)調用攔截器之三:
實現(xiàn)核心的攔截器類當某個方法被JDK調用之前或之后執(zhí)行相應的攔截器的方法.至于要攔截哪一個對象,則需通過后面的操作來體現(xiàn).
PersonIntercepter.java
- package cn.edu.hld;
 - public class PersonIntercepter
 - {
 - public void method1()
 - {
 - System.out.println("method_1被執(zhí)行了!") ;
 - }
 - public void method2()
 - {
 - System.out.println("method_2被執(zhí)行了!") ;
 - }
 - }
 
JDK實現(xiàn)調用攔截器之四:
為了讓攔截器知道其要攔截的目標對象,以及其應執(zhí)行的方法,則應該創(chuàng)建一個類,該類實現(xiàn)一個JDK反射體系里的接口InvocationHandler.
ProxyHandler .java
- 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;
 - }
 - }
 
JDK實現(xiàn)調用攔截器之五:
為了根據(jù)目標對象生成一個代理對象,還應該創(chuàng)建一個代理工廠.
MyProxyFactory.java
- 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) ;
 - }
 - }
 
JDK實現(xiàn)調用攔截器之六:
主程序的實現(xiàn).
TestPerson.java
- 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() ;
 - }
 - }
 
JDK實現(xiàn)調用攔截器之七:
直接在MyEclipse中運行.得到結果如下:
- method_1被執(zhí)行了!
 - 我是thtwin
 - method_2被執(zhí)行了!
 - 我想跑得快一些!
 
JDK實現(xiàn)調用攔截器的基本框架和方法就介紹完了,那么現(xiàn)在你對JDK實現(xiàn)調用攔截器是不是有所了解了呢?
【編輯推薦】















 
 
 









 
 
 
 