1 使用field

long start = System.nanoTime();

Field[] fields = CallCount.class.getDeclaredFields();

for (String str : dateList) {

boolean exist = false;

for (Field field : fields){

field.setAccessible(true);

if (field.getName().endsWith(str)) {

int value = 0;

for (CallCount callCount : callCountList) {

value += (Integer)field.get(callCount);

}

resultList.add(value);

exist = true;

break;

}

}

if (!exist) {

resultList.add(0);

}

}

long end = System.nanoTime();

log.info("old call cost :" + (end-start));

2 使用 org.apache.commons.beanutils.BeanUtils来获取属性

long start = System.nanoTime();

for (String str : dateList) {

Integer value = getMinuteAccessCount(str, callCountList);

resultList.add(value);

}

long end = System.nanoTime();

log.info("new call cost :" + (end-start));

private Integer getMinuteAccessCount(String minute, List callCountList) {

Integer result = 0;

String propertyName = "logMinute" + minute;

for (CallCount callCount : callCountList) {

int value = 0;

try {

value = Integer.valueOf(BeanUtils.getProperty(callCount, propertyName));

} catch (NumberFormatException | IllegalAccessException | InvocationTargetException | NoSuchMethodException e) {

e.printStackTrace();

}

result += value;

}

return result;

}

3 使用java.lang.reflect.Method获取值

long start = System.nanoTime();

for (String str : dateList) {

Integer value = getMinuteAccessCount(str, callCountList);

resultList.add(value);

}

long end = System.nanoTime();

log.info("new call cost :" + (end-start));

private Integer getMinuteAccessCount(String minute, List callCountList) {

Integer result = 0;

for (CallCount callCount : callCountList) {

int value = 0;

try {

Method method = callCount.getClass().getDeclaredMethod("getLogMinute"+minute);

Object obj = method.invoke(callCount);

value = (Integer)obj;

} catch (NumberFormatException | IllegalAccessException | InvocationTargetException | NoSuchMethodException e) {

e.printStackTrace();

}

result += value;

}

return result;

}

4 耗时对比,在使用相同的查询条件,相同的数据的情况下。通过实验得到以下两组数据(耗时/纳秒)

1 old call cost :517599

1 old call cost :347916

1 old call cost :337312

1 old call cost :177893

1 old call cost :131709

1 old call cost :82789

1 old call cost :63973

3 new call cost :925383

3 new call cost :794016

3 new call cost :912382

1 old call cost :755016

1 old call cost :365364

1 old call cost :231944

1 old call cost :123498

1 old call cost :103315

1 old call cost :92025

1 old call cost :81762

2 new call cost :139741338

2 new call cost :3387140

2 new call cost :2230497

2 new call cost :9215854

2 new call cost :2313970

2 new call cost :1549374

2 new call cost :1884291

2 new call cost :1100880

2 new call cost :1488138

每组数据前的数字代表之前取值的方式。

由数据对比可以看出,耗时最小的,始终是方式1,并且方式1在多次调用时,耗时是逐步减少的,可能是有缓存机制。

耗时第二少的是方式3,耗时最多的是方式2.

5 解析

方式1,采用了最基本的java反射方式,使用Filed,循环bean的Field,得到Object,再转换为Integer类型。 方式2,采用了看似最简洁的BeanUitls,根据属性名,获取属性值。这样最耗时。 方式3,采用了获取bean的Method,然后invoke的方式来获取值。

java反射效率对比_Java反射三种方式的效率对比相关推荐

  1. JAVA解决生产消费者_Java常用三种方式解决生产者消费者问题(详细)

    package test; /** * Synchronized 版本解决生产者消费者 * wait() / notify()方法 */ import java.util.LinkedList; im ...

  2. 读取Java文件到byte数组的三种方式及Java文件操作大全(包括文件加密,String加密)

    读取Java文件到byte数组的三种方式 package zs;import java.io.BufferedInputStream; import java.io.ByteArrayOutputSt ...

  3. java的如何创建js_[Java教程]JS创建事件的三种方式(实例)

    [Java教程]JS创建事件的三种方式(实例) 0 2016-05-11 14:00:16 1.普通的定义方式 οnclick="Sfont=prompt('请在文本框中输入红色','红色' ...

  4. 三种方式细胞评分对比

    三种方式细胞评分对比 library(patchwork) library(ggplot2) library(ggalluvial) library(svglite) library(Seurat) ...

  5. Java生成唯一标识码的三种方式

    Java生成唯一标识码的三种方式 前言 我们经常会遇到这样的场景,需要生成一个唯一的序列号来表明某一个数据的唯一性,在单节点的应用中我们可以简单地使用一个自增的整型来实现实现,但是在分布式情况下这个方 ...

  6. 详解C#实例化对象的三种方式及性能对比

    前言 做项目过程中有个需求要实例化两万个对象并添加到List 中,这个过程大概需要1min才能加载完(传参较多),于是开启了代码优化之旅,再此记录. 首先想到的是可能实例化比较耗时,于是开始对每种实例 ...

  7. java反射获取实体类_java 反射获取类对象的三种方式

    Java反射经常用到的就是获取对象中的属性,那么Java获取类对象就是必不可少的啦! Java实体类: public class ReflexModel { private String code; ...

  8. 【Java】 数组转 List 的三种方式及对比

    本文介绍Java中数组转为List三种情况的优劣对比,以及应用场景的对比,以及程序员常犯的类型转换错误原因解析. 一. (最高效) 通过集合工具类Collections.addAll()方法,支持增删 ...

  9. java源代码实例倒计时_Java倒计时三种实现方式代码实例

    写完js倒计时,突然想用java实现倒计时,写了三种实现方式 一:设置时长的倒计时: 二:设置时间戳的倒计时: 三:使用java.util.Timer类实现的时间戳倒计时 代码如下: package ...

  10. 面试题,反射创建类实例的三种方式是什么

    1.获得Class:主要有三种方法: (1)Object-->getClass (2)任何数据类型(包括基本的数据类型)都有一个"静态"的class属性 (3)通过class ...

最新文章

  1. .NET Core 3.0 Preview 6中对ASP.NET Core和Blazor的更新
  2. opencv 的特征提取算子SIFT/ORB/SURF
  3. pythonlbp纹理提取_Python + OpenCV 实现LBP特征提取的示例代码
  4. java lambda 多个参数_Java Lambda行为参数化
  5. 一旦有辞职念头就干不长了吗_如何理性而高效地辞职?
  6. 手机型号大全_双十一高价位华为手机推荐,2020年哪款更值得入手
  7. linux发送邮件 脚本,linux脚本发送邮件 shell发送邮件(使用 msmtp+mutt+shell来实现)
  8. 计算机硬件工程师主要干什么,计算机硬件工程师主要学习什么内容
  9. BZOJ3654 : 图样图森破
  10. linux定时对准时间,Linux校对时间
  11. 职高学计算机可以考的大学名单,职高可以考的大学有哪些
  12. Python之父愤然退位:再也无法忍受他们鄙视我的意见
  13. QML地图简介(1)
  14. c语言学生管理系统中人数,python下学生管理系统:从文件中读取30位学生的信息(含邮箱),并实现简单的增、删、查找、统计(邮箱使用人数)。---附程序哦!...
  15. 倍福TwinCAT(贝福Beckhoff)应用教程12.2 TwinCAT控制松下伺服 NC初步
  16. line android 英文版,line tv国际版
  17. php+b2b2c+商城,PHP源码:SHOPNC b2b2c电商平台系统,im+结算补丁+商城专题页插件
  18. 产业园区招商策略“ 新思路 ”
  19. 合作式智能运输系统-车用通信系统应用层及应用数据交互标准
  20. Nginx与Tomcat负载均衡

热门文章

  1. 跨国实时网络调度系统设计
  2. LiveVideoStackCon 2018公布优秀出品人与讲师
  3. C语言文件操作 fopen, fclose, mkdir(打开关闭文件,建文件夹,判断文件是否存在可读或可写)
  4. TensorFlow文件操作
  5. 现代c++之线程本地存储thread_local
  6. leetcode 239. Sliding Window Maximum | 239. 滑动窗口最大值(单调栈,窗口内最大最小值更新结构)
  7. JVM系列之:对象的锁状态和同步
  8. java中functional interface的分类和使用
  9. Spring Boot中的Properties
  10. 浅谈最小生成树的算法思路(一)Prim算法