Java动态代理

发表于:2010-4-02 10:41

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:未知    来源:51Testing软件测试网采编

#
java

  这几天温习了一下关于java反射的内容,发现JAVA提供了动态代理的默认实现(以前没用到过),主要由Proxy类,InvocationHandler接口(在java.lang.reflect包中)组成。

  下面演示一个使用 Proxy 和 InvocationHandler 类实现动态代理的例子,这个动态代理对被代理对象的方法执行时间进行计时,并将执行时间打印输出到控制台。

  1、被代理类的接口Proxied

  Java代码

package Test1;
// 被代理类 需实现的 接口

public interface Proxied {
  void doSomething();
  void doSomethingElse(String str);
}

  2、一个 Proxied接口 的实现类(被代理类)

  Java代码

package Test1;
public class ConcreteProxied implements Proxied {
  @Override
    public void doSomething() {
    try {
      Thread.sleep(100);
    } catch (InterruptedException e) {
      System.err.println("Error : InterruptedException");
    }
      System.out.println(this.getClass().getSimpleName()
      + " >> doSomething .");
    }
  @Override
    public void doSomethingElse(String str) {
    try {
      Thread.sleep(150);
    } catch (InterruptedException e) {
      System.err.println("Error : InterruptedException");
    }
      System.out.println(this.getClass().getSimpleName()
      + " >> doSomethingElse , argument = " + str + ".");
    }
}

  3、TimingInvocationHandler 类,实现了 InvocationHandler 接口

  Java代码

package Test1;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class TimeingInvocationHandler implements InvocationHandler{
//被代理的对象
private Object proxied;
  public TimeingInvocationHandler(Object proxied){
  this.proxied = proxied;
  }
// 参数  proxy 表示代理类的对象
// 参数  method 表示被代理类 和 代理类 都实现的接口 的方法对象
// 参数  args 表示方法 method 的参数数组
@Override
public Object invoke(Object proxy, Method method, Object[] args)
  throws Throwable {
    System.out.println(method.getDeclaringClass().getName());
    long currentTimeMillis = System.currentTimeMillis();
    Object ret = method.invoke(proxied, args);
    System.out.println(this.getClass().getSimpleName()+" >> wastes time : "
    +(System.currentTimeMillis() - currentTimeMillis)+"ms");
    return ret;
  }
}

21/212>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号