由于反射涉及动态解析的类型,某些Java虚拟机的优化不能被执行,所以导致了一定的性能的问题,特别是在JDK6以前特别严重,有时甚至达到数百倍,但是在JDK6以后,据说性能差别就不是哪么大了,JDK对此做了优化。但是总还是有那么数10倍的性能差异,那我们就让他跑得再快点吧。

我们通常情况下写反射都是这样写:

  1. SomeObject someObject = new SomeObject();  
  2. Class<? extends SomeObject> cls = SomeObject.class;  
  3. Method method = cls.getDeclaredMethod("someGetMethod");  
  4. String xxx = (String) method.invoke(someObject);

这种写法从功能上来说是不会有问题的,但是从性能上来说,却是使用反射性能最差的一种方式了,每次都需要做访问检查,这个是比较消耗性能的,如果把访问检查,有人测试过,性能一下子从原来的300倍差异,降低到了只有数10倍差异:

  1. SomeObject someObject = new SomeObject();  
  2. Class<? extends SomeObject> cls = SomeObject.class;  
  3. Method method = cls.getDeclaredMethod("someGetMethod");  
  4. <span style="color:#FF0000;"><strong>method.setAccessible(Boolean.TRUE);</strong></span>  
  5. String xxx = (String) method.invoke(someObject);

但是即使这样,还是会涉及到每次方法的重新查找,这个也是比较耗性能的,我们可以通过把方法全部缓存起来的方式,这样只要方法被使用过一次,后面就不需要再次查找了,性能又会有一定的提升:

  1. public Method getMethod(String name, @SuppressWarnings("rawtypes") Class... parameterTypes) throws SecurityException, NoSuchMethodException {  
  2. Method method = classMethodMap.get(name);//classMethodMap used to store method
  3. if (classMethodMap.get(name) == null) {  
  4. method = someClass.getDeclaredMethod(name, parameterTypes);//someClass is the reflect object class
  5. method.setAccessible(Boolean.TRUE);  
  6. concentrationClassMethodMap.put(name, method);  
  7. }  
  8. return method;  
  9. }

然后调用的时候就只需要通过方法getMethod去获取反射方法即可,如果已经执行过了,就直接返回,如果缓存中不存在,就查找一次后并缓存起来。

最新文章

  1. caffe源码解析
  2. 浏览器中的Javascript的简单对话框
  3. 移除IIS默认的响应头(转载)
  4. 0x和H都表示十六进制有什么区别吗?
  5. hdu 2050
  6. backbone todo example
  7. javascript之正则表达式总结
  8. [置顶] MapReduce 编程之 倒排索引
  9. android 通过shape设置圆形按钮
  10. webService返回自定义类型的数据处理
  11. mysql连接字符集default
  12. STM32单片机在Keil5下仿真的问题解决及GPIO口初始化、使用
  13. 【Egret】里使用video标签
  14. phtread_mutex 组合
  15. Spring Boot简单xml配置集成mybatis
  16. HDU3488 Tour [有向环覆盖 费用流]
  17. 基于SSE4和多核编程的电子相册的实现
  18. Python中进程线程协程小结
  19. python基础(二)列表与字典
  20. Java基础--枚举

热门文章

  1. PHP Curl CURLOPT_POSTFIELDS 1024
  2. C#时间日期操作
  3. 数字时钟DigClock
  4. GDAL python教程(1)——用OGR读写矢量数据
  5. 你会用shuffle打乱列表吗?
  6. 【每天一个Linux命令】12. Linux中which命令的用法
  7. 运行预构建 Linux 映像的 Windows Azure 虚拟机中的交换空间 – 第 1 部分
  8. iOS 数组里面取字典的值
  9. centos扩容(pv,vg,lv)
  10. 前端web应用组件化(一) 徐飞