文档章节

使用 Java 的代理机制进行日志输出

sun_beauty
 sun_beauty
发布于 2017/01/03 11:55
字数 491
阅读 24
收藏 0

    通过面向接口编程进行日志输出因为要使用代理类,就必须要实现固定的接口,具有一定的局限性。有没有一种通用的机制,不管是不是实现这个接口,都可以实现日志信息的输出?

    Java提供的 InvocationHandler 接口可以实现这种功能。

   首先编写一个日志信息的代理类,这个代理类实现了接口 InvocationHandler,然后和前面一个实例类似,编写一个接口并实现这个接口,在实现类中编写具体的订票业务代码,最后针对接口编写测试代码。

(1)编写日志信息的代理类 LogProxy,这个代理类实现了接口 InvocationHandler,可以对任何接口实现日志信息的输出

package com.gc.action;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

import org.apache.log4j.Level;
import org.apache.log4j.Logger;

/*
 * 日志信息的代理类
 */
public class LogProxy 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);
    }
    //针对接口编程
    @Override
    public Object invoke(Object proxy, Method method, Object[] args)
            throws Throwable {
        Object result = null;
        try {
            //在方法调用前后进行日志输出
            logger.log(Level.INFO, args[0] + " 开始订票");
            result = method.invoke(delegate, args);
            logger.log(Level.INFO, args[0] + " 订票结束");
        } catch (Exception e) {
            logger.log(Level.INFO, e.toString());
        }
        return result;
    }
    

}

(2)编写接口 FlyBookInterface

package com.gc.impl;

public interface FlyBookInterface {
    public void doBook(String name);
}
(3) FlyBookInterface的实现类,其中doBook实现具体的订票业务代码

package com.gc.action;

import com.gc.impl.FlyBookInterface;

public class FlyBook implements FlyBookInterface{
    @Override
    public void doBook(String name) {
        // 订票相关的具体业务代码
        
    }

}
(4)编写测试代码,使用日志代理类 LogProxy 实现日志的输出

package com.gc.action;

import com.gc.impl.FlyBookInterface;

public class TestFlyBook {
    public static void main(String[] args) {
        //实现了对日志类的重用
        LogProxy logProxy = new LogProxy();
        FlyBookInterface flyBookProxy = (FlyBookInterface)logProxy.bind(new FlyBook());
        flyBookProxy.doBook("喵喵");
    }
}
 

运行结果:

[INFO ] 2017-01-03 11:47:40 com.gc.action.LogProxy-喵喵 开始订票
[INFO ] 2017-01-03 11:47:40 com.gc.action.LogProxy-喵喵 订票结束

© 著作权归作者所有

sun_beauty
粉丝 8
博文 20
码字总数 7556
作品 0
通州
私信 提问
Spring 事务管理高级应用难点剖析: 第 2 部分

Spring 抽象的 DAO 体系兼容多种数据访问技术,它们各有特色,各有千秋。像 Hibernate 是非常优秀的 ORM 实现方案,但对底层 SQL 的控制不太方便;而 iBatis 则通过模板化技术让您方便地控制...

红薯
2010/03/28
803
1
谈谈字节码增强(一)之java动态代理

最近看到很多人在分享动态代理的实现,想到上次在公司分享过一次字节码增强方面的技术,这里随便写写,做个总结。 什么叫做字节码增强技术? 个人理解,是在Java字节码生成之后,运行期对其进...

一滴水的坚持
2018/06/08
0
0
轻量级的 Android 字节码编辑插件 - DroidAssist

是一个轻量级的 Android 字节码编辑插件,基于 Javassist 对字节码操作,根据 xml 配置处理 class 文件,以达到对 class 文件进行动态修改的效果。和其他 AOP 方案不同,DroidAssist 提供了一...

匿名
05/14
410
0
淘宝Tprofiler工具实现分析

项目首页:https://github.com/alibaba/TProfiler 工具介绍 TProfiler是一个可以在生产环境长期使用的性能分析工具.它同时支持剖析和采样两种方式,记录方法执行的时间和次数,生成方法热点 对...

伍咖
2015/11/14
270
0
[jvm]九java gc分析

Java GC就是JVM记录仪,书画了JVM各个分区的表演。 什么是 Java GC Java GC(Garbage Collection,垃圾收集,垃圾回收)机制,是Java与C++/C的主要区别之一,作为Java开发者,一般不需要专门...

菜鸟腾飞
2018/12/02
0
0

没有更多内容

加载失败,请刷新页面

加载更多

代理模式之JDK动态代理 — “JDK Dynamic Proxy“

动态代理的原理是什么? 所谓的动态代理,他是一个代理机制,代理机制可以看作是对调用目标的一个包装,这样我们对目标代码的调用不是直接发生的,而是通过代理完成,通过代理可以有效的让调...

code-ortaerc
今天
5
0
学习记录(day05-标签操作、属性绑定、语句控制、数据绑定、事件绑定、案例用户登录)

[TOC] 1.1.1标签操作v-text&v-html v-text:会把data中绑定的数据值原样输出。 v-html:会把data中值输出,且会自动解析html代码 <!--可以将指定的内容显示到标签体中--><标签 v-text=""></......

庭前云落
今天
8
0
VMware vSphere的两种RDM磁盘

在VMware vSphere vCenter中创建虚拟机时,可以添加一种叫RDM的磁盘。 RDM - Raw Device Mapping,原始设备映射,那么,RDM磁盘是不是就可以称作为“原始设备映射磁盘”呢?这也是一种可以热...

大别阿郎
今天
12
0
【AngularJS学习笔记】02 小杂烩及学习总结

本文转载于:专业的前端网站☞【AngularJS学习笔记】02 小杂烩及学习总结 表格示例 <div ng-app="myApp" ng-controller="customersCtrl"> <table> <tr ng-repeat="x in names | orderBy ......

前端老手
昨天
16
0
Linux 内核的五大创新

在科技行业,创新这个词几乎和革命一样到处泛滥,所以很难将那些夸张的东西与真正令人振奋的东西区分开来。Linux内核被称为创新,但它又被称为现代计算中最大的奇迹,一个微观世界中的庞然大...

阮鹏
昨天
20
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部