zoukankan      html  css  js  c++  java
  • 让Java的反射跑快点

    由于反射涉及动态解析的类型,某些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;  

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

  • 相关阅读:
    深入浅出Redis(三)高级特性:管道
    CxImage的编译及简单使用举例
    [Zlib]_[0基础]_[使用zlib库压缩文件]
    java 实现打印当前月份的日历
    hdu 5087 Revenge of LIS II ( LIS ,第二长子序列)
    spring理解一
    poj 3181 Dollar Dayz (整数划分问题---递归+DP)
    android键盘事件
    Linux编程环境介绍(2) -- shell(Bash) 介绍
    iphone开发中数据持久化之——嵌入式SQLite(三)
  • 原文地址:https://www.cnblogs.com/mxcy/p/3974116.html
Copyright © 2011-2022 走看看