- 浏览: 396530 次
- 性别:
- 来自: 重庆
文章分类
- 全部博客 (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 1820在使用executors并发编程时候需要注意,如果出现Thr ... -
java process can not exited
2012-09-28 10:20 1074/** * User: weichun.zhan ... -
java单例模式在多线程环境下的测试
2012-07-23 22:24 1064java单例模式在多线程环境下的测试,进攻自己学习和复习用. ... -
JAVA获取CLASSPATH路径
2012-07-04 16:52 784http://www.blogjava.net/tbwshc/ ... -
计算机补码
2012-03-28 16:35 932名词解释: 补码:1 在计算机系统中,数值一律有补码 ... -
Java中HashMap排序和遍历 .
2011-12-02 17:24 9313HashMap排序 1、按照key排序 对于java中 ... -
java开源项目汇总
2011-05-17 15:42 953http://www.open-open.com/index. ... -
OperaMasks
2011-04-19 10:31 930demo:http://demo.operamasks.org ... -
1000个0-9的数字,查找出现次数最多的3个数字.并求这他们出现的次数.
2011-04-06 21:41 5415今天面试碰到 "1000个0-9的数字,查找出现次数 ... -
Java开源 Jsp标签库
2011-02-25 13:52 1699displytag 与Struts结合使用最出名的一个tag主 ... -
阅读优秀代码是提高开发人员修为的一种捷径
2011-02-24 10:57 867原文作者Alan Skorkin是一 ... -
线程池
2010-12-06 17:31 985http://hi.baidu.com/ecspell/blo ... -
JAVA String.format 方法使用介绍
2010-10-25 13:36 3295JAVA String.format 方法使用 ... -
用 Eclipse 插件提高代码质量
2010-10-12 11:12 959用 Eclipse 插件提高代码质量 参考文章. http: ... -
Java代码分析工具——Eclipse插件nWire 1.3发布
2010-09-26 17:34 2974近日,Eclipse插件nWire 1.3发布。nWire可以 ... -
归并算法详解
2010-07-28 13:03 1725MergeSort,归并排序。 [1 ... -
java util date转换成java sql date
2010-06-11 13:26 1812在util date转换成sqldate过程中可以使用new ... -
java获取操作系统类型
2010-05-14 17:12 2604判断当前java程序是运行在windows平台还是运行在lin ... -
Java:回调机制
2010-05-10 14:14 10801. 什么是回调函数 回调函数(callback ... -
关于native
2010-05-10 14:04 1131adj.1. 出生地的, 故乡的, 本国的2. 当地(人)的; ...
相关推荐
Java非对称加密源程序代码实例,本例中使用RSA加密技术,定义加密算法可用 DES,DESede,Blowfish等。 设定字符串为“张三,你好,我是李四” 产生张三的密钥对(keyPairZhang) 张三生成公钥(publicKeyZhang...
anylog 为开发人员提供一个易于使用的平台,帮助开发人员在正在运行的系统中随时加入自己想要的日志,而免于修改代码和重启。 使用场景举例 1、一些同学在写代码时,把异常吃掉了,使得问题难以查找,可以...
定时任务:在线(添加、修改、删除)任务调度包含执行结果日志。 代码生成:前后端代码的生成(java、html、xml、sql)支持CRUD下载 。 系统接口:根据业务代码自动生成相。能 小程序用户管理 商
Java非对称加密源程序代码实例,本例中使用RSA加密技术,定义加密算法可用 DES,DESede,Blowfish等。 设定字符串为“张三,你好,我是李四” 产生张三的密钥对(keyPairZhang) 张三生成公钥(publicKeyZhang...
javax.transaction.xa 提供定义事务管理器和资源管理器之间的协定的 API,它允许事务管理器添加或删除 JTA 事务中的资源对象(由资源管理器驱动程序提供)。 javax.xml 根据 XML 规范定义核心 XML 常量和功能。 ...
JCarder 是一个用来查找多线程应用程序中一些潜在的死锁,通过对 Java 字节码的动态分析来完成死锁分析。 Java的Flash解析、生成器 jActionScript jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。...
接收用户的聊天信息是由多线程技术实现的,因为客户端必须时时关注更新服务器上是否有最新消息,在本程序中设定的是3秒刷新服务器一次,如果间隔时间太短将会增加客户端与服务器端的通信负担,而间隔时间长就会让人...
接收用户的聊天信息是由多线程技术实现的,因为客户端必须时时关注更新服务器上是否有最新消息,在本程序中设定的是3秒刷新服务器一次,如果间隔时间太短将会增加客户端与服务器端的通信负担,而间隔时间长就会让人...
JCarder 是一个用来查找多线程应用程序中一些潜在的死锁,通过对 Java 字节码的动态分析来完成死锁分析。 Java的Flash解析、生成器 jActionScript jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。...
applications和applet,applications可以在控制台直接运行,与其他高级编程语言没有太大区别,而java的特色在于它具有编制小应用程序的功能,applet可以在internet上传输并在兼容java的web浏览器中运行的程序;...
3、运行程序前需安装以上插件并在application.yml中配置。 4、本程序的功能为: 1)、拉取RTSP流转推RTMP,支持H265转H264。 2)、可选择使用javaCV推流、ffmpeg推流两种方式。 3)、javaCV仅支持拉去或推送H264...
javax.transaction.xa 提供定义事务管理器和资源管理器之间的协定的 API,它允许事务管理器添加或删除 JTA 事务中的资源对象(由资源管理器驱动程序提供)。 javax.xml 根据 XML 规范定义核心 XML 常量和功能。 ...
JCarder 是一个用来查找多线程应用程序中一些潜在的死锁,通过对 Java 字节码的动态分析来完成死锁分析。 Java的Flash解析、生成器 jActionScript jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。...
JCarder 是一个用来查找多线程应用程序中一些潜在的死锁,通过对 Java 字节码的动态分析来完成死锁分析。 Java的Flash解析、生成器 jActionScript jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。...
JCarder 是一个用来查找多线程应用程序中一些潜在的死锁,通过对 Java 字节码的动态分析来完成死锁分析。 Java的Flash解析、生成器 jActionScript jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。...
javax.transaction.xa 提供定义事务管理器和资源管理器之间的协定的 API,它允许事务管理器添加或删除 JTA 事务中的资源对象(由资源管理器驱动程序提供)。 javax.xml 根据 XML 规范定义核心 XML 常量和功能。 ...
JCarder 是一个用来查找多线程应用程序中一些潜在的死锁,通过对 Java 字节码的动态分析来完成死锁分析。 Java的Flash解析、生成器 jActionScript jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。...
Java 选修课程管理系统,广东石油化工学院计算机07-1班 Logic 陈罗志原创程序,使用Eclipse+Mysql开发,代码中预设的Mysql数据库用户名为root,密码为admin,运行程序,测试用户用户名chenluozhi 密码chenluozhi ...