文本版|topic 高级搜索
   名人堂 帮助 论坛制度 意见反馈 | 首页 博客 周新贴 专题 求职 读书
RSS 底部
 
社区导航: 专家门诊   网络技术   操作系统   数据库   程序设计   系统应用   考试认证   CIO及信息化   站长交流   综合交流   下载基地  51CTO产品服务 设为首页 | 收藏本站
51CTO技术论坛» Java » 用 java.lang.reflect.Proxy 制作类似AOP 的方法调用 Log 层       [ 打印]  [ 订阅]  [ 收藏]  [ 推荐给朋友]   [ 本帖文本页]

论坛跳转:
     
标题: [转载] 用 java.lang.reflect.Proxy 制作类似AOP 的方法调用 Log 层  ( 查看:336  回复:0 )   
 
yuanpengfei
技术员  点击可查看详细



帖子 43
精华 0
无忧币 235
积分 225
阅读权限 30
注册日期 2007-8-17
最后登录 2007-8-24 离线

[查看资料]  [发短消息]  [Blog
       
发表于:2007-8-23 10:47   标题:用 java.lang.reflect.Proxy 制作类似AOP 的方法调用 Log 层
上一帖 |
个人认为,java.lang.reflect.Proxy 简直是懒人必备的工具。
如,我负责编写一个分布式系统的一个服务,别的应用要调用我的服务的 RMI接口方法。而多人开发有着一个必然的缺点:每人负责的模块均对外提供接口,但事情往往会因为接口的定义者、实现者、使用者间对接口理解的偏差,而在软件的开发中引出不少麻烦。于是,接口调用日志就有作用了。特别是 RMI Interface 的日志。

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.text.MessageFormat;
import java.util.Arrays;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
/**
*Afactoryofmethodinvokeloginterceptor.
*logtheinvokeparamandresult.
*@param
*/
publicclass InvokeLogProxyFactory {
    publicclass MyInvocationHandler implements InvocationHandler {
       private Level logLevel;      
       private TargetInterface impl;      
       public MyInvocationHandler(Level logLevel, TargetInterface impl) {
           this.logLevel = logLevel;
           this.impl = impl;
       }
       public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
           final Logger log = Logger.getLogger( impl.getClass() );
           String msg = MessageFormat.format( "Calling method {0}({1})", method.getName(), Arrays.toString( args ) );
           log.log( logLevel, msg );
           Object returnedResult = null;
           try {
               returnedResult = method.invoke( impl, args );
           } catch ( InvocationTargetException e ) {
              String msg1 = MessageFormat.format( "Call method[{0}]: catch exceptions:", method.getName() );
              log.log( logLevel, msg1, e.getCause() );
              throw e.getCause();
           } catch( Throwable e ) {
              log.error( "Runtime exception:", e );
              throw e;
           }
           log.log( logLevel, "returned val=" + returnedResult );
           return returnedResult;
       }
    }   
    @SuppressWarnings("unchecked")
    public TargetInterface create(TargetInterface impl, Level logLevel) {
       MyInvocationHandler handler = new MyInvocationHandler( logLevel, impl);
         Object result = Proxy.newProxyInstance(impl.getClass().getClassLoader(),
                 impl.getClass().getInterfaces(),
                 handler);
         return (TargetInterface) result;      
    }
   
}



论坛活动:测测你对IT技术大会的了解指数(赠微软礼品、无忧币)
2007-8-23 10:471楼
[ 顶部 ]
     
论坛跳转:  

| | |

标记已读 · 删除论坛Cookies · 文本版 · WAP
 
| 诚征版主 | 版主堂 | 意见建议 | 大史记 | 论坛地图
Copyright©2005-2008 51CTO.COM  Powered by Discuz!
本论坛言论纯属发布者个人意见,不代表51CTO网站立场!如有疑义,请与管理员联系。
京ICP备05051492号