java中的动态代理

   Java在JDK1.3之后加入了可协助开发动态代理功能的API.使用动态代理,可以使一个处理者(代理)服务于各个对象。创建一个动态代理类只需实现java.lang.reflect.InvocationHandler接口。

  下面创建一个处理日志的动态代理类LogHandler去代理HelloSpeaker类

   首先创建HelloSpeaker的接口

package com.test;

public interface IHello {
    public void sayHello(String name);
}

   然后创建HelloSeaker

package com.test;
public class HelloSpeaker implements IHello {
 public void sayHello(String name) {
  System.out.println("hello:"+name);
 }
}

  最后创建LogHandler类

package com.test;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.logging.Logger;

public class LogHandler implements InvocationHandler {

 private Logger logger = Logger.getLogger(this.getClass().getName());

 private Object delegate;

 public Object bind(Object delegate) {
  this.delegate = delegate;
  return Proxy.newProxyInstance(delegate.getClass().getClassLoader(),
    delegate.getClass().getInterfaces(), this);

 }

 public Object invoke(Object proxy, Method method, Object[] args)
   throws Throwable {
  Object result = null;
  try {
   logger.info("method start..." + method);
   result = method.invoke(delegate, args);
   logger.info("method end..." + method);
  } catch (Exception e) {
   logger.info(e.getMessage());
  }
  return result;
 }

}

 好了,现在我们编写一个测试类Demo

package com.test;
public class Demo {

 public Demo() {
  // TODO Auto-generated constructor stub
 }

 /**
  * @param args
  */
 public static void main(String[] args) {
  LogHandler logHandler = new LogHandler();
  
  IHello hello = (IHello)logHandler.bind(new HelloSpeaker());
  
  hello.sayHello("cat");
 }

}

 运行一下结果为:

hello:cat
2010-3-1 17:38:21 com.test.LogHandler invoke
信息: method start...public abstract void com.test.IHello.sayHello(java.lang.String)
2010-3-1 17:38:21 com.test.LogHandler invoke
信息: method end...public abstract void com.test.IHello.sayHello(java.lang.String)

 

说明:

LogHandle的Proxy.newProxyInstance()静态方法建立一个代理对象,建立代理对象必须告知所要代理的接口,之后可以操作所建立的代理对象。在每次操作时都会执行InvocationHandler的invoke方法,invoke()方法会传入被代理对象的方法名称与执行参数,实际上要执行的方法会交由method.invoke(),在method.invoke()前后加上日志的动作,method.invoke()传回的对象是实际方法执行过后的回传结果。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值