`

java代码中动态添加程序执行时间日志

    博客分类:
  • java
 
阅读更多

在写java代码的过程中经常会遇到需要打印一个方法的执行时间,如果在代码中直接写开始和结束时间,然后计算运行时间,这样感觉不太好,代码的耦合性太高,可以通过java的动态代理或者cglib 加上annotation(标注)来实现。
1.通过cglib代理打印当前方法的执行时间.
代码如下:

代理类:

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.lang.reflect.Method;

/**
* User: weichun.zhan
* Date: 12-10-25
* Time: 下午3:09
*/
public class ServiceProxy implements MethodInterceptor {

    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        Logger logger = LoggerFactory.getLogger(method.getDeclaringClass().getName());
        Object result = null;

        MethodRunTimeLog methodRunTimeLog = method.getAnnotation(MethodRunTimeLog.class);
        if (methodRunTimeLog !=null && methodRunTimeLog.debug()) {
            long start = System.currentTimeMillis();
            result = methodProxy.invokeSuper(o, objects); //因为cglib是通过继承类来实现代理,so需调用invokesuper
            long end = System.currentTimeMillis();
            logger.info("Excute  [{}] method took time [{}]ms.", method.getName(), (end - start));

        } else {
            result = methodProxy.invokeSuper(o, objects);
        }
        return result;
    }

    public Object createProxy(Class targetClass) {
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(targetClass);
        enhancer.setCallback(new ServiceProxy());
        return enhancer.create();
    }
}
 

调用类:
ServiceProxy test = new ServiceProxy();
MovieInfoServiceServiceImpl proxyTarget = (MovieInfoServiceServiceImpl)test.createProxy(MovieInfoServiceServiceImpl.class);
 


2.当然也可以通过jdk的动态代理来做,代码如下:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

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

/**
* User: weichun.zhan
* Date: 12-10-25
* Time: 下午6:03
*/
public class MovieInfoServiceProxy implements InvocationHandler {

    private MovieInfoService impl;

    public MovieInfoServiceProxy(MovieInfoService impl){
        this.impl = impl;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        Logger logger = LoggerFactory.getLogger(method.getDeclaringClass().getName());

        Object result = null;
       //获取调用方法的method对象,不能直接调用method,不知为什么还没仔细研究
        MethodRunTimeLog methodRunTimeLog = impl.getClass().getMethod(method.getName(),method.getParameterTypes()).getAnnotation(MethodRunTimeLog.class);
        if (methodRunTimeLog !=null && methodRunTimeLog.debug()) {
            long start = System.currentTimeMillis();
            result = method.invoke(impl, args);
            long end = System.currentTimeMillis();
            logger.info("Excute  [{}] method took time [{}]ms.", method.getName(), (end - start));

        } else {
            result = method.invoke(impl, args);
        }
        return result;
    }
}
 


调用代码:
 MovieInfoService proxyTarget = (MovieInfoService) Proxy.newProxyInstance(MovieInfoService.class.getClassLoader(),
                MovieInfoServiceImpl.class.getInterfaces(),new MovieInfoServiceProxy(new MovieInfoServiceImpl()));
        return proxyTarget;
 

标注类:

import java.lang.annotation.*;

/**
 * User: weichun.zhan
 * Date: 12-10-25
 * Time: 下午4:09
 */

@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface MethodRunTimeLog {

    boolean debug() default false;

}

 ServiceImpl:

 

@MethodRunTimeLog(debug = true)
    public List<MovieInfo> queryMovieInfos(Collection<String> cids) throws SQLException {
  //具体的实现省略。。。。
}

 

 

 

 

分享到:
评论

相关推荐

    java swing用Logger输出错误日志.docx

    总之,Java Swing应用可以通过`java.util.logging`包中的`Logger`类,结合`logging.properties`配置文件或在代码中动态设置,实现对错误日志的记录和管理。这不仅可以帮助开发者调试程序,也是生产环境中监控系统...

    linux下脚本编译java,定时删除日志

    在Linux环境下,编写脚本来编译Java代码以及定时删除日志是常见的系统管理任务,这有助于保持系统的高效运行和良好的资源管理。以下是关于这个主题的详细讲解。 首先,让我们了解如何在Linux下编译Java程序。Java源...

    java语言编写的日历日志程序

    Java语言编写的日历日志程序是一个典型的课程设计项目,主要目标是让学生掌握Java编程基础以及实际应用。这个程序提供了日历浏览和日志管理的功能,对于初学者来说,这样的项目能够帮助他们深入理解面向对象编程、...

    Java简易日志组件

    在Java世界中,日志系统扮演着至关重要的角色,它可以帮助开发者追踪程序运行的问题,优化性能,以及在出现问题时提供详细的诊断信息。本组件旨在提供一个简单易用且功能齐全的日志解决方案。 日志组件的基本功能...

    log4j使用与java中log4j记录日志如何写入数据库

    在Java开发中,日志记录是一项非常重要的任务,它能够帮助开发者追踪程序运行时的状态,定位错误和异常,便于后期的调试和维护。Log4j是Apache组织提供的一款开源的日志记录工具,它功能强大、灵活易用。本文将详细...

    日志 java日志收集的简单代码和简单程序

    在Java编程中,日志是记录应用程序运行过程中的事件、错误和信息的重要工具。日志收集可以帮助开发者在软件开发和维护阶段追踪问题、优化性能以及理解系统行为。本篇文章将详细探讨Java日志收集的基本概念、常用日志...

    Log4j定时打印日志及添加模块名配置的Java代码实例共

    例如,如果我们希望在日志中包含类名,可以将`ConversionPattern`设置为: ```properties log4j.appender.FILE.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p [%t] %c{1}.%M - %m%n ``` 这里的`%c{1}`...

    Java代码管理器

    Java代码管理器是一款基于Java语言开发的工具,用于高效地组织、存储和管理代码文件。在软件开发过程中,代码管理是至关重要的,它可以帮助开发者跟踪代码版本,协同工作,以及保持代码库的整洁和有序。Java作为一款...

    java聊天程序源代码

    9. **日志记录**:为了追踪和调试程序,通常会在代码中添加日志记录功能,以便了解程序运行时的状态和错误信息。 10. **测试与调试**:编写完聊天程序后,需要进行充分的测试,包括单元测试、集成测试和系统测试,...

    java程序代码不能运行的几个基本原因

    2. **利用日志**:通过在关键代码段添加打印语句或使用专门的日志框架记录程序运行过程中的状态信息,有助于快速定位问题。 3. **逐步调试**:利用IDE提供的调试功能(如断点、单步执行等),逐步跟踪程序的执行流程...

    生成kettle作业的Java代码.rar

    在这个场景中,我们讨论的是如何利用Java代码生成并运行Kettle作业。 首先,让我们详细了解Kettle作业。Kettle作业是一系列步骤的集合,这些步骤按照特定顺序执行,通常用于执行一系列ETL任务。它们可以包含数据...

    shell,bat脚本运行java程序

    总的来说,shell和bat脚本提供了一种方便的方式来管理和运行Java程序,特别是对于需要定时执行或在后台运行的任务,它们能极大地简化操作流程。通过熟练掌握这两种脚本,你可以更高效地管理Java应用的生命周期。

    java代码xpdf实例

    Java代码中的XPDF实例主要涉及的是使用XPDF库在Java应用程序中处理PDF文档。XPDF是一套开源的PDF工具,包括了PDF文档的查看、转换、提取文本等能力。在这个实例中,我们可能会关注以下几个核心知识点: 1. **XPDF ...

    AOP拦截日志JAVA

    AOP的核心概念是“横切关注点”和“切面”,它们在程序运行时被插入到正常的业务逻辑中,以实现解耦和模块化。 在Java中,Spring框架提供了强大的AOP支持。当我们谈论"AOP拦截日志JAVA"时,我们主要关注如何使用...

    Java动态代理程序切片示例

    Java动态代理是Java编程中的一种高级技术,它允许在运行时创建代理类,这些代理类可以作为原有类的代理,从而在调用原有方法时添加额外的功能或行为。在这个示例中,我们专注于如何利用注解来实现对JavaBean的动态...

    如何执行Java代码审查

    Java 代码审查清单 一、代码整洁清单项分类 1. 使用有意义的名称:变量、函数和类名应该能够表达实际...本清单包含了代码整洁、安全、性能、综合和静态代码分析等方面的知识点,旨在帮助开发者编写高质量的Java代码。

    Java电子琴源代码

    这涉及到断点、单步执行、日志记录等技巧。 通过研究这个Java电子琴源代码,开发者不仅可以掌握Java GUI编程,还能深入理解音频处理、多线程以及面向对象编程的实际应用。这是一个集成了多种Java技术的综合项目,...

    logback日志级别动态切换的终极方案(Java ASM使用).doc

    【logback日志级别动态切换】是Java应用中常见的需求,尤其在大型分布式系统中,为了应对不同的运行环境和性能优化,需要灵活调整日志输出级别。本文将介绍一种使用Java ASM库实现的终极解决方案。 首先,理解...

    aop思想的java代码实现

    在Java中,AOP主要用于解决系统中的横切关注点,如日志、事务管理、权限控制等,这些关注点通常会分散在各个业务逻辑中,使得代码变得冗余和复杂。通过AOP,我们可以将这些关注点抽取到单独的模块,称为切面,然后在...

    java监听器+quartz实现每天动态时间执行任务的功能

    在Java编程中,实现每天动态时间执行任务的功能通常涉及到事件监听和定时任务调度。这个项目“java监听器+quartz实现每天动态时间执行任务的功能”是结合了Java的监听器机制和Quartz定时任务框架来完成这样的需求。...

Global site tag (gtag.js) - Google Analytics