- 浏览: 404719 次
- 性别:
- 来自: 重庆
文章分类
- 全部博客 (144)
- java (25)
- hibernate (2)
- spring (6)
- struts (1)
- oracle (14)
- mysql (3)
- jdbc (1)
- 面试经历 (0)
- linux (12)
- 工具小技巧 (7)
- 个人随笔 (0)
- 设计模式 (5)
- jsf (0)
- ejb3.0 (1)
- Web (3)
- jsp&servlet (1)
- Ruby (2)
- JQuery (4)
- 测试 (1)
- javascript (12)
- Android (7)
- asp.net (0)
- php (0)
- 职业发展 (3)
- 励志 (0)
- Struts2 (1)
- CSS (1)
- other (2)
- 性能优化 (1)
- CURL (1)
- scala (2)
- Nginx 配置文件详解 (1)
- resin (1)
- python (1)
- 开源中最好的Web开发的资源 (1)
- hadoop (1)
- idea (2)
- redis (1)
- git (1)
- rails (1)
- tomcat (1)
- springmvc (1)
- VLC (1)
- nginx (1)
- ffmpeg (2)
- tools (1)
最新评论
-
happy.future:
这个注册码好用的,记录了一下 http://www.danie ...
java IntelliJ IDEA 13 注册码 IDEA序列号 License Key -
lpyy00892012:
有问题啊,下拉框会变小啊
jquery easyui三级联动 -
怪兽加outman:
个人还是比较看好GUI Design Studio的,分享一个 ...
推荐两个界面原型设计工具--GUIDesignStudio 和 Mockups For Desktop -
zhanwc:
xzz7175327 写道感谢、、、十分有用!不客气
Css圆角边框 -
xzz7175327:
感谢、、、十分有用!
Css圆角边框
在写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 { //具体的实现省略。。。。 }
发表评论
-
Executors的Thread table can't grow past 16383 threads异常
2013-01-30 12:50 1882在使用executors并发编程时候需要注意,如果出现Thr ... -
java process can not exited
2012-09-28 10:20 1122/** * User: weichun.zhan ... -
java单例模式在多线程环境下的测试
2012-07-23 22:24 1125java单例模式在多线程环境下的测试,进攻自己学习和复习用. ... -
JAVA获取CLASSPATH路径
2012-07-04 16:52 825http://www.blogjava.net/tbwshc/ ... -
计算机补码
2012-03-28 16:35 977名词解释: 补码:1 在计算机系统中,数值一律有补码 ... -
Java中HashMap排序和遍历 .
2011-12-02 17:24 9359HashMap排序 1、按照key排序 对于java中 ... -
java开源项目汇总
2011-05-17 15:42 991http://www.open-open.com/index. ... -
OperaMasks
2011-04-19 10:31 1008demo:http://demo.operamasks.org ... -
1000个0-9的数字,查找出现次数最多的3个数字.并求这他们出现的次数.
2011-04-06 21:41 5507今天面试碰到 "1000个0-9的数字,查找出现次数 ... -
Java开源 Jsp标签库
2011-02-25 13:52 1738displytag 与Struts结合使用最出名的一个tag主 ... -
阅读优秀代码是提高开发人员修为的一种捷径
2011-02-24 10:57 913原文作者Alan Skorkin是一 ... -
线程池
2010-12-06 17:31 1031http://hi.baidu.com/ecspell/blo ... -
JAVA String.format 方法使用介绍
2010-10-25 13:36 3335JAVA String.format 方法使用 ... -
用 Eclipse 插件提高代码质量
2010-10-12 11:12 1020用 Eclipse 插件提高代码质量 参考文章. http: ... -
Java代码分析工具——Eclipse插件nWire 1.3发布
2010-09-26 17:34 3018近日,Eclipse插件nWire 1.3发布。nWire可以 ... -
归并算法详解
2010-07-28 13:03 1764MergeSort,归并排序。 [1 ... -
java util date转换成java sql date
2010-06-11 13:26 1851在util date转换成sqldate过程中可以使用new ... -
java获取操作系统类型
2010-05-14 17:12 2686判断当前java程序是运行在windows平台还是运行在lin ... -
Java:回调机制
2010-05-10 14:14 11381. 什么是回调函数 回调函数(callback ... -
关于native
2010-05-10 14:04 1182adj.1. 出生地的, 故乡的, 本国的2. 当地(人)的; ...
相关推荐
总之,Java Swing应用可以通过`java.util.logging`包中的`Logger`类,结合`logging.properties`配置文件或在代码中动态设置,实现对错误日志的记录和管理。这不仅可以帮助开发者调试程序,也是生产环境中监控系统...
在Linux环境下,编写脚本来编译Java代码以及定时删除日志是常见的系统管理任务,这有助于保持系统的高效运行和良好的资源管理。以下是关于这个主题的详细讲解。 首先,让我们了解如何在Linux下编译Java程序。Java源...
Java语言编写的日历日志程序是一个典型的课程设计项目,主要目标是让学生掌握Java编程基础以及实际应用。这个程序提供了日历浏览和日志管理的功能,对于初学者来说,这样的项目能够帮助他们深入理解面向对象编程、...
在Java世界中,日志系统扮演着至关重要的角色,它可以帮助开发者追踪程序运行的问题,优化性能,以及在出现问题时提供详细的诊断信息。本组件旨在提供一个简单易用且功能齐全的日志解决方案。 日志组件的基本功能...
在Java开发中,日志记录是一项非常重要的任务,它能够帮助开发者追踪程序运行时的状态,定位错误和异常,便于后期的调试和维护。Log4j是Apache组织提供的一款开源的日志记录工具,它功能强大、灵活易用。本文将详细...
在Java编程中,日志是记录应用程序运行过程中的事件、错误和信息的重要工具。日志收集可以帮助开发者在软件开发和维护阶段追踪问题、优化性能以及理解系统行为。本篇文章将详细探讨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作为一款...
9. **日志记录**:为了追踪和调试程序,通常会在代码中添加日志记录功能,以便了解程序运行时的状态和错误信息。 10. **测试与调试**:编写完聊天程序后,需要进行充分的测试,包括单元测试、集成测试和系统测试,...
2. **利用日志**:通过在关键代码段添加打印语句或使用专门的日志框架记录程序运行过程中的状态信息,有助于快速定位问题。 3. **逐步调试**:利用IDE提供的调试功能(如断点、单步执行等),逐步跟踪程序的执行流程...
在这个场景中,我们讨论的是如何利用Java代码生成并运行Kettle作业。 首先,让我们详细了解Kettle作业。Kettle作业是一系列步骤的集合,这些步骤按照特定顺序执行,通常用于执行一系列ETL任务。它们可以包含数据...
总的来说,shell和bat脚本提供了一种方便的方式来管理和运行Java程序,特别是对于需要定时执行或在后台运行的任务,它们能极大地简化操作流程。通过熟练掌握这两种脚本,你可以更高效地管理Java应用的生命周期。
Java代码中的XPDF实例主要涉及的是使用XPDF库在Java应用程序中处理PDF文档。XPDF是一套开源的PDF工具,包括了PDF文档的查看、转换、提取文本等能力。在这个实例中,我们可能会关注以下几个核心知识点: 1. **XPDF ...
AOP的核心概念是“横切关注点”和“切面”,它们在程序运行时被插入到正常的业务逻辑中,以实现解耦和模块化。 在Java中,Spring框架提供了强大的AOP支持。当我们谈论"AOP拦截日志JAVA"时,我们主要关注如何使用...
Java动态代理是Java编程中的一种高级技术,它允许在运行时创建代理类,这些代理类可以作为原有类的代理,从而在调用原有方法时添加额外的功能或行为。在这个示例中,我们专注于如何利用注解来实现对JavaBean的动态...
Java 代码审查清单 一、代码整洁清单项分类 1. 使用有意义的名称:变量、函数和类名应该能够表达实际...本清单包含了代码整洁、安全、性能、综合和静态代码分析等方面的知识点,旨在帮助开发者编写高质量的Java代码。
这涉及到断点、单步执行、日志记录等技巧。 通过研究这个Java电子琴源代码,开发者不仅可以掌握Java GUI编程,还能深入理解音频处理、多线程以及面向对象编程的实际应用。这是一个集成了多种Java技术的综合项目,...
【logback日志级别动态切换】是Java应用中常见的需求,尤其在大型分布式系统中,为了应对不同的运行环境和性能优化,需要灵活调整日志输出级别。本文将介绍一种使用Java ASM库实现的终极解决方案。 首先,理解...
在Java中,AOP主要用于解决系统中的横切关注点,如日志、事务管理、权限控制等,这些关注点通常会分散在各个业务逻辑中,使得代码变得冗余和复杂。通过AOP,我们可以将这些关注点抽取到单独的模块,称为切面,然后在...
在Java编程中,实现每天动态时间执行任务的功能通常涉及到事件监听和定时任务调度。这个项目“java监听器+quartz实现每天动态时间执行任务的功能”是结合了Java的监听器机制和Quartz定时任务框架来完成这样的需求。...