由于反射涉及动态解析的类型,某些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去获取反射方法即可,如果已经执行过了,就直接返回,如果缓存中不存在,就查找一次后并缓存起来。

让Java的反射跑快点的更多相关文章

  1. 简单模拟Java中反射的应用场景

    有人说Java是一门静态语言.那么何为静态语言,动态语言又是什么? 1.动态语言 是一类在运行时可以改变其结构的语言:例如新的函数.对象.甚至代码可以 被引进,已有的函数可以被删除或是其他结构上的变化 ...

  2. JAVA的反射理解

    1----------------------------反射的概念----------------------------------------------- JAVA的反射机制是在运行状态中,对 ...

  3. java的反射

    JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性:这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制. ...

  4. iOS运行时编程(Runtime Programming)和Java的反射机制对比

    运行时进行编程,类似Java的反射.运行时编程和Java反射的对比如下:   1.相同点   都可以实现的功能:获取类信息.属性设置获取.类的动态加载(NSClassFromString(@“clas ...

  5. Java 类反射机制分析

    Java 类反射机制分析 一.反射的概念及在Java中的类反射 反射主要是指程序可以访问.检测和修改它本身状态或行为的一种能力.在计算机科学领域,反射是一类应用,它们能够自描述和自控制.这类应用通过某 ...

  6. java的反射机制

    一.java的反射机制浅谈 最近研究java研究得很给力,主要以看博文为学习方式.以下是我对java的反射机制所产生的一些感悟,希望各位童鞋看到失误之处不吝指出.受到各位指教之处,如若让小生好好感动, ...

  7. Java:反射

    初识Java反射机制: 从上面的描述可以看出Java的反射机制使得Java语言可以在运行时去认识在编译时并不了解的类/对象的信息,并且能够调用相应的方法或修改属性的值.Java反射机制的核心就是允许在 ...

  8. Java中反射机制和Class.forName、实例对象.class(属性)、实例对象getClass()的区别

    一.Java的反射机制   每个Java程序执行前都必须经过编译.加载.连接.和初始化这几个阶段,后三个阶段如下图:   其中

  9. java笔记--反射进阶之总结与详解

    一.反射进阶之动态设置类的私有域 "封装"是Java的三大特性之一,为了能更好保证其封装性,我们往往需要将域设置成私有的, 然后通过提供相对应的set和get方法来操作这个域.但是 ...

随机推荐

  1. 【转】Pjax是什么以及为什么推荐大家用

    http://my.oschina.net/sub/blog/12344 技术增强的文章,可以看一下 .

  2. win7 64位安装 oracle 11G 和 使用 PLSQL Developer 连接服务器

    其实基本过程和网上大多数人的完全一样,只是后面的plsql上加了几张图片而已,以此给自己做个记录,万一网上的没了,这里自己还有,会了的大森(大神),就请路过吧 1.双击开始安装

  3. 【JQ成长笔记】jQuery cookie的使用

    jquery cookie挺好用的.简单实在.菜鸟都能用得上..额.文笔不好不好..咳咳.. 先来看看jq.cookie的aip 写入cookie $.cookie("this-cookie ...

  4. PHP环境(apache,PHP,Mysql)详细配置方法

    1.安装Apache ,直接运行安装即可,我们将其安装到D:\PHP\Apache/目录下 2.将PHP压缩包解压内容放到指定目录(例如:D:\PHP\Php5,将目录中的PHP.iniDevelop ...

  5. 【java】一维数组循环位移方阵

    输出: 左移:7 4 8 9 1 5 4 8 9 1 5 7 8 9 1 5 7 4 9 1 5 7 4 8 1 5 7 4 8 9 5 7 4 8 9 1 右移:5 7 4 8 9 1 1 5 7 ...

  6. 【Chromium中文文档】跨进程通信 (IPC)

    跨进程通信 (IPC) 转载请注明出处:https://ahangchen.gitbooks.io/chromium_doc_zh/content/zh//General_Architecture/I ...

  7. 11.java.lang.ArrayStoreException

    java.lang.ArrayStoreException 数组存储异常 当试图将类型不兼容类型的对象存入一个Object[]数组时将引发异常 Object[] obj = new String[3] ...

  8. CentOS 七 vs CentOS 6的不同

    CentOS 七 vs CentOS 6的不同   CentOS 7 vs CentOS 6的不同(1)桌面系统[CentOS6] GNOME 2.x[CentOS7] GNOME 3.x(GNOME ...

  9. Spring单例与线程安全小结

    一.Spring单例模式与线程安全   Spring框架里的bean,或者说组件,获取实例的时候都是默认的单例模式,这是在多线程开发的时候要尤其注意的地方. 单例模式的意思就是只有一个实例.单例模式确 ...

  10. javascript获取url地址问好后面的值,包括问号

    javascript获取url地址问好后面的值,包括问号 <!DOCTYPE html> <html lang="en"> <head> < ...