JAVA动态代理实现

转帖|其它|编辑:郝浩|2008-10-08 09:55:50.000|阅读 1145 次

概述:在目前的Java开发包中包含了对动态代理的支持,但是其实现只支持对接口的的实现。

# 界面/图表报表/文档/IDE等千款热门软控件火热销售中 >>

  在目前的Java开发包中包含了对动态代理的支持,但是其实现只支持对接口的的实现。

  其实现主要通过是java.lang.reflect.Proxy类和java.lang.reflect.InvocationHandler接口。

  Proxy类主要用来获取动态代理对象,InvocationHandler接口用来约束调用者实现,如下,HelloWorld接口定义的业务方法,HelloWorldImpl是HelloWorld接口的实现,HelloWorldHandler是 InvocationHandler接口实现。代码如下:

  业务接口:

  public interface HelloWorld {

    void sayHelloWorld() ;

  }
 
  业务接口实现:

  public class HelloWorldImpl implements HelloWorld {

    public void sayHelloWorld() {

      System.out.println("Hello World!");

    }

  }
 
  InvocationHandler实现,需要在接口方法调用前后加入一部份处理工作,这里仅仅在方法调用前后向后台输出两句字符串,其代码如下:

  import java.lang.reflect.InvocationHandler;

  import java.lang.reflect.Method;

  public class HelloWorldHandler implements InvocationHandler {

    //要代理的原始对象

    private Object objOriginal;

    /**

    * 构造函数。

    * @param obj 要代理的原始对象。

    */

    public HelloWorldHandler(Object obj) {

      this.objOriginal = obj ;

    }

    public Object invoke(Object proxy, Method method, Object[] args)

    throws Throwable {

      Object result ;

      //方法调用之前

      doBefore();

      //调用原始对象的方法

      result = method.invoke(this.objOriginal ,args);

      //方法调用之后

      doAfter();

      return result ;

    }

    private void doBefore() {

      System.out.println("before method invoke!");

    }

    private void doAfter() {

      System.out.println("after method invoke!");

    }

  }[SPAN]
 
  测试代码:

  import java.lang.reflect.InvocationHandler;

  import java.lang.reflect.Proxy;

  public class Test {

    public static void main(String[] args) {

      HelloWorld hw = new HelloWorldImpl();

      InvocationHandler handler = new HelloWorldHandler(hw);

      HelloWorld proxy = (HelloWorld) Proxy.newProxyInstance(hw.getClass().getClassLoader(),hw.getClass().getInterfaces(),handler);

      proxy.sayHelloWorld();

    }

  }
 
首先获取一个业务接口的实现对象;

获取一个InvocationHandler实现,此处是HelloWorldHandler对象;

创建动态代理对象;

通过动态代理对象调用sayHelloWorld()方法,此时会在原始对象HelloWorldImpl. sayHelloWorld()方法前后输出两句字符串。

  运行测试类输出如下:

  before method invoke!

  Hello World!

  after method invoke!

  此处Test类中的方法调用代码比较多,在我们的实际应用中可以通过配置文件来来简化客户端的调用实现。另外也可以通过动态代理来实现简单的AOP。


标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@evget.com

文章转载自:IT专家网论坛

为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
扫码咨询


添加微信 立即咨询

电话咨询

客服热线
023-68661681

TOP