熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

Java實現的攔截器

2022-06-13   來源: Java核心技術 

  攔截器在在流行的開源框架中很常見依賴的技術就是Java的動態代理

  理解攔截器的核心原理對理解這些開源框架的體系結構至關重要

  下面以一個簡單的模型的來說明攔截器的實現的一般方法

  模型分為以下模塊

  業務組件是被代理和被攔截的對象

  代理處理器實現了InvocationHandler接口的一個對象

  代理對象Proxy對象

  攔截器普通的JavaBean在調用業務方法的之前或者之後會自動攔截並執行自己的一些方法

  客戶端執行業務處理的入口

  以下是模型的實現

  一業務組件分為業務接口和業務類

  /**

  * 業務組件接口

  */

  public interface BusinessInterface {

  public void doSomething();

  }

  /**

  * 業務組件

  */

  public class BusinessClass implements BusinessInterface{

  public void doSomething() {

  Systemoutprintln(業務組件BusinessClass方法調用:doSomething());

  }

  }

  二代理處理器包含了業務對象綁定動態代理類的處理並實現了 InvocationHandler接口的invoke方法

  import javalangreflectInvocationHandler;

  import javalangreflectMethod;

  import javalangreflectProxy;

  /**

  * 動態代理處理器工具

  */

  public class DynamicProxyHandler implements InvocationHandler {

  private Object business;    //被代理對象

  private InterceptorClass interceptor = new InterceptorClass();    //攔截器

  /**

  * 動態生成一個代理類對象並綁定被代理類和代理處理器

  *

  * @param business

  * @return 代理類對象

  */

  public Object bind(Object business) {

  thisbusiness = business;

  return ProxynewProxyInstance(

  //被代理類 的ClassLoader

  businessgetClass()getClassLoader()

  //要被代理 的接口本方法返回對象會自動聲稱實現了這些接口

  businessgetClass()getInterfaces()

  //代理處理 器對象

  this);

  }

  /**

  * 代理要調用的方法並在方法調用前後調用連接器的方法

  *

  * @param proxy  代理類對象

  * @param method 被代理的接口方法

  * @param args   被代理接口方法的參數

  * @return 方法調用返回的結果

  * @throws Throwable

  */

  public Object invoke(Object proxy Method method Object[] args) throws Throwable {

  Object result = null;

  interceptorbefore();

  result=methodinvoke(businessargs);

  interceptorafter();

  return null;  //To change body of implemented methods use File | Settings | File Templates

  }

  }

  三攔截器普通的JavaBean在調用業務方法的之前或者之後會自動攔截並執行自己的 一些方法

  /**

  * 攔截器

  */

  public class InterceptorClass {

  public void before(){

  Systemoutprintln(攔截器InterceptorClass方法調用:before()!);

  }

  public void after(){

  Systemoutprintln(攔截器InterceptorClass方法調用:after()!);

  }

  }

  四模擬客戶端執行業務處理的入口

  /**

  * 客戶端

  */

  public class Client {

  public static void main(String args[]) {

  DynamicProxyHandler handler = new DynamicProxyHandler();

  BusinessInterface business = new BusinessClass();

  BusinessInterface businessProxy = (BusinessInterface) handlerbind(business);

  businessProxydoSomething();

  }

  }


From:http://tw.wingwit.com/Article/program/Java/hx/201311/27143.html
  • 上一篇文章:

  • 下一篇文章:
  • 推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.