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

    很简单的位模拟(bit-mask),可惜队友读题误以为很难,没有及时跟我交流,不然应该很早就可以出了. 很容易看出来,总共才16个点.24条边.用一个int类型数字就可以描述这个图了,按照16点的关系 ...

  2. EassyMock实践 自定义参数匹配器

    虽然easymock中提供了大量的方法来进行参数匹配,但是对于一些特殊场合比如参数是复杂对象而又不能简单的通过equals()方法来比较,这些现有的参数匹配器就无能为力了.easymock为此提供了I ...

  3. [C++空间分配]new运算符、operator new、placement new的区别于联系

    先科普一下: 1. new的执行过程: (1)通过operator new申请内存 (2)使用placement new调用构造函数(内置类型忽略此步) (3)返回内存指针 2. new和malloc ...

  4. leetcode first bad version python

    # The isBadVersion API is already defined for you. # @param version, an integer # @return a bool # d ...

  5. css3——webkit-animation动画

    -webkit-animation:仍旧是一个复合属性,   -webkit-animation: name duration timing-function delay iteration_coun ...

  6. mysql数据类型整理

    mysql 中数据类型主要有三种 文本.数字 ,日期/时间 文本类型:char 定长,varchar变长,都是最多65535,char多了会截取,varchar少了自动补长.text最多65535,b ...

  7. Flink资料(2)-- 数据流容错机制

    数据流容错机制 该文档翻译自Data Streaming Fault Tolerance,文档描述flink在流式数据流图上的容错机制. ------------------------------- ...

  8. Android LocalActivityManager的用法

    在开发中会碰到在一个activity中的局部(或者是activity的Fragment中)显示其他的activity 的内容,这时就用到了LocalActivityManager类. 假设这个容器是一 ...

  9. Android 保存图片到SQLite,读出SQLite中的图片

    1.bitmap保存到SQLite 中 数据格式: db.execSQL("Create table express ( _id INTEGER PRIMARY KEY AUTOINCREM ...

  10. [LeetCode][Python]Longest Substring Without Repeating Characters

    # -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com'https://oj.leetcode.com/problems/longest ...