注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

欢迎来到三件事的空间

欢迎登陆 javacs.cn

 
 
 

日志

 
 

spring学习2-AOP动态代理  

2009-02-16 15:05:46|  分类: spring笔记 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

先讲jdk--AOP

在jdk1.3之后加入了可协助开发动态代理功能的API ,你不必为特定的对象与方法编写特定的代理对象,使用动态代理必须实现java.lang.reflect.InvocationHandler接口

举个例子 package aop;

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

public class LogHandler implements InvocationHandler {
 private Logger logger = Logger.getLogger(this.getClass().getName());

 private Object delegate;
    /**
     * 建立一个代理对象,建立代理对象必须告知所要代理的接口,之后可以操作所建立的对象
     * @param delegate
     * @return
     */
 public Object bind(Object delegate) {
  this.delegate = delegate;
  return Proxy.newProxyInstance(delegate.getClass().getClassLoader(),
    delegate.getClass().getInterfaces(), this);
 }

 private void log(String message){
  logger.log(Level.INFO,message);
 }
 /**
  * 每次操作生成后的代理对象时候会执行InvocationHandler的invoke()方法,invoke方法会代理对象的方法名词与执行参数
  */
 public Object invoke(Object proxy, Method method, Object[] args)
   throws Throwable {
  Object  result=null;
  try{
   log("method starts..."+method);
   //由method.invoke()方法去调用实体类的方法
   result=method.invoke(delegate, args);
   logger.log(Level.INFO,"method ends..."+method);
  }catch(Exception e){
   log(e.toString());
  }
  return null;
 }

}

 

要实现动态代理,必须定义所要代理的接口 例如:

package aop;

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

实现类

public class HelloSpeaker implements IHello{

 public void hello(String name) {
  System.out.println("Hello, "+name);
  
 }
}

测试类:

public class ProxyDemo {

 public static void main(String[]  args){
  LogHandler logh=new LogHandler();
  IHello  helloProxy=(IHello)logh.bind(new HelloSpeaker());
  helloProxy.hello("Justin");
 }
}

输出结果:

2009-2-16 15:04:24 aop.LogHandler log
信息: method starts...public abstract void aop.IHello.hello(java.lang.String)
Hello, Justin
2009-2-16 15:04:24 aop.LogHandler invoke
信息: method ends...public abstract void aop.IHello.hello(java.lang.String)

  评论这张
 
阅读(309)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017