`
903452746
  • 浏览: 7399 次
  • 性别: Icon_minigender_1
  • 来自: 福州
社区版块
存档分类
最新评论

java的反射机制的效率

    博客分类:
  • java
阅读更多


 java的反射机制是程序能够在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法,这些特性使我们只需编写比以前少的多的代码,就可以来完成相同的功能,但是反射带来的多余的性能消耗却是我们需要关注的,性能的消耗点是哪里,这些都需要清楚。

废话就不多说了,直接上测试数据先

以下就是对一个set方法的普通调用,反射调用,获取set反射方法执行时间的对比

运行环境1: cpu:intel i5-3210 2.5GHz  内存 :8G  JDK1.6 x64   操作系统:win7

 



 

运行环境 2

手机:cpu: 高通 1.4G 单核  内存:850M(除去操作系统,其他应用,剩下还没100M %>_<%)操作系统:android 2.3.4

 

 

 再来就是测试源码了

package com.example.android_test;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Date;
public class Test {
 public static long times = 1000;
    public static final String str="111";
 /**
  * @param args
  * @throws InvocationTargetException 
  * @throws IllegalAccessException 
  * @throws NoSuchMethodException 
  * @throws IllegalArgumentException 
  * @throws SecurityException 
  */
 public static void main(String[] args) throws SecurityException, IllegalArgumentException, NoSuchMethodException, IllegalAccessException, InvocationTargetException {
   normal();
   reflect();
   reflectMethod();
 }
 /**
  * 普通方法
  */
 public static void normal() {
  Demo demo = new Demo();
  Date dateS = new Date();
  printUsedMemory();
  for (int i = 0; i < times ; i++) {
   demo.setStr(str);
  }
  printUsedMemory();
  Date dateE = new Date();
  long time = dateE.getTime() - dateS.getTime();
  System.out.println(time + "毫秒");
 }
 /**
  * 反射方法
  * @throws SecurityException
  * @throws NoSuchMethodException
  * @throws IllegalArgumentException
  * @throws IllegalAccessException
  * @throws InvocationTargetException
  */
 public static void reflect() throws SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException {
  Demo demo = new Demo();
  Date dateS = new Date();
  Method m;
  m = Demo.class.getMethod("setStr", String.class);
  printUsedMemory();
  for (int i = 0; i < times; i++) {
   
   m.invoke(demo, str);
  }
  printUsedMemory();
  Date dateE = new Date();
  long time = dateE.getTime() - dateS.getTime();
  System.out.println(time + "毫秒");
 }
 /**
  * 获取反射方法
  * @throws SecurityException
  * @throws NoSuchMethodException
  * @throws IllegalArgumentException
  * @throws IllegalAccessException
  * @throws InvocationTargetException
  */
 public static void reflectMethod() throws SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException {
  Demo demo = new Demo();
  Date dateS = new Date();
  Method m;
  
  printUsedMemory();
  for (int i = 0; i < times; i++) {
   m = Demo.class.getMethod("setStr", String.class);
  }
  printUsedMemory();
  Date dateE = new Date();
  long time = dateE.getTime() - dateS.getTime();
  System.out.println(time + "毫秒");
 }
 public static long printUsedMemory() {
  long totalMemory = Runtime.getRuntime().totalMemory();
  long freeMemory = Runtime.getRuntime().freeMemory();
  long usedMemory = totalMemory - freeMemory;
  System.out.println("虚拟机已用内存:" + usedMemory + " Byte|" + usedMemory / 1024 + " KB");
  return usedMemory;
 }
}

 

 准备好这些,那么就开始分析数据了

第一个分析点:普通方法和反射的数据对比,从以上两个环境的数据的平均值来看,PC的调用时间差距是4倍左右, 手机的的调用时间差距是15倍左右(平均后的数据,大概啦); 虽然有这样的差距,但是PC端在10万次的调用中,仅仅耗时53ms,在测试例子中的方法调用已经排除了对象创建的消耗,现实场景中加上多余对象操作的消耗,一秒完全可以跑完(除非里面真的写了耗时的操作),在手机端上,10万次的计算,也才815ms,实际场景中手机端一次操作进行10万次的反射调用,几乎没有!在考虑的反射带来的方便和它的性能消耗,完全可以忽略这些消耗啦!

第二个分析点:获取反射方法,看看以上的数据,其消耗的时间是执行反射方法的10倍,随着执行次数的增加,呈几何递增啊!而在自己看来,获取反射方法就是获取类的信息,类的信息在运行时不会变化,完全没有必要重复取反射方法,可以设计一套缓存的机制,将这些类的信息缓存起来,达到提高效率的目的,这样带来的内存消耗当然是必不可少的,但是怎么把握这个平衡点就看自己了。

第三点分析点:内存问题!使用反射比普通的调用,其实就多了反射相关对象的创建的内存消耗,不过与其带来的便利相比,是可以接受的。(个人感觉这些对象其实占不了多大内存啦,纯属个人意见,勿喷)

 

总结:通过以上的分析,个人觉得,无论的PC还是移动,反射完全可以随意使用,但是对使用反射的过程中做相应的优化还是必须的

(以上皆是个人意见,若有错误,欢迎指正)

 

  • 大小: 17 KB
  • 大小: 16.5 KB
分享到:
评论
1 楼 回归蔚蓝 2015-09-29  
这个要点个赞

相关推荐

    Java反射机制 Java反射机制

    ### Java反射机制详解 ...尽管存在一定的性能和安全性上的问题,但在合理设计和使用的情况下,Java反射机制可以极大地提高软件的开发效率和维护性。开发者在使用反射时应当权衡其利弊,谨慎选择应用场景。

    java反射机制工具类

    Java反射机制是Java编程语言中的一个强大特性,它允许程序在运行时检查和操作类、接口、字段和方法的信息。这个特性使得Java具备了高度的灵活性,能够在运行时动态地发现和使用类的属性和方法,即使这些信息在编译时...

    java反射机制详解

    Java 反射机制详解 Java 反射机制是 Java 语言中一个强大的...Java 反射机制是一个强大且灵活的功能,它可以帮助开发者在运行时动态地获取类的信息和调用对象的方法,从而提高了 Java 语言的编程灵活性和开发效率。

    java学习笔记(java 反射机制 流 内存管理)

    本笔记主要涵盖了四个核心知识点:Java反射机制、流(I/O流)、内存管理和Java学习的基础。以下是对这些主题的详细阐述: 一、Java反射机制 Java反射机制是Java语言的一个强大特性,允许程序在运行时检查类、接口、...

    Java 反射机制浅析

    Java反射机制是Java编程语言中一个强大的特性,它允许程序在运行时动态地获取类的信息并操作类的对象。反射机制的核心在于,它打破了编译时的束缚,使得代码具有更高的灵活性和可扩展性。在Java中,反射主要依赖于`...

    java反射效率

    本文将深入探讨Java反射的效率问题,以及何时、如何谨慎使用反射以优化性能。 首先,理解反射的工作原理至关重要。当Java程序使用反射时,它不再依赖于编译时的静态类型信息,而是动态地获取和调用类的方法,访问...

    java反射机制详解与应用

    总的来说,Java反射机制是Java编程中不可或缺的一部分,它为程序提供了强大的动态性,但也需要开发者在使用时平衡效率和安全性。通过理解和掌握反射,开发者可以更好地利用Java平台的潜力,实现更加灵活和强大的软件...

    Java反射机制在数据持久层轻量级ORM框架中的应用研究.pdf

    由于Java反射机制允许程序在运行时构造和访问任何类的属性和方法,它为Reflect-ORM框架提供了实现的理论基础。通过反射,框架可以动态地读取对象的属性信息,将这些信息转换为数据库的表结构,以及将数据库查询结果...

    Android平台与Web服务数据交互时运用Java反射机制解析数据的研究.pdf

    Android平台与Web服务数据交互时运用Java反射机制解析数据的研究 本文研究了Android平台与...本文的研究结果表明,使用Java反射机制可以提高Android平台与Web服务数据交互的效率,并提高软件系统的灵活性和可扩展性。

    Java反射 JavaBean对象自动生成插入,更新,删除,查询sql语句操作.docx

    * 高效开发:使用Java反射机制可以快速生成sql语句,提高开发效率。 * 灵活性强:可以根据实际情况自动生成不同的sql语句,提高代码的灵活性。 * 可维护性强:使用Java反射机制可以轻松地维护和更新sql语句,提高...

    JAVA反射机制详解

    ### JAVA反射机制详解 #### 一、JAVA反射机制概述 反射是Java编程语言的一个核心特性,它允许程序在运行时获取类的信息,并且可以动态地创建对象和调用方法。这种能力使得Java程序具备了高度的灵活性和扩展性。...

    Java反射机制视频教程

    Java反射机制是Java编程语言中的一个强大工具,它允许程序在运行时检查并操作类、接口、对象等的内部信息。这个"Java反射机制视频教程"可能是为了帮助开发者深入理解这一概念,尽管描述中提到视频质量可能不尽如人意...

    java反射机制,详细解释了,java反射机制原理、

    Java 反射机制是 Java 语言提供的一种强大的工具,它允许程序在运行时检查和操作对象的内部属性和方法。这种机制使得代码具有高度的灵活性和动态性,能够在执行过程中根据需要动态地发现和调用类的方法,创建对象,...

    用Java反射机制简化Struts框架逻辑控制.pdf

    为了克服这一挑战,潘彬斌和王成良提出了一种创新性的解决方案——利用Java反射机制结合XML技术来简化Struts框架的逻辑控制,从而提高开发效率。 #### Struts框架与Java反射机制 ##### Struts框架 Struts框架基于...

    候捷谈Java反射机制

    ### 候捷谈Java反射机制 #### 一、引言 在计算机科学领域,Java作为一门广泛应用的编程语言,其强大的功能与灵活性受到了众多开发者的青睐。其中一个关键特性便是**反射机制**(Reflection),这一机制使Java具备...

    Java反射常用机制

    通过阅读《Java反射机制-较全面PPT.ppt》这样的资源,你可以更深入地理解这些概念,并学习如何在实际项目中安全有效地使用反射。这不仅有助于提高代码的灵活性,也有助于解决某些特定场景下的编程难题。在学习过程中...

    Java 的反射机制

    Java反射机制使得我们可以在程序运行时获取到类的所有属性和方法。例如,`Class&lt;?&gt; clazz = Class.forName("className");` 这行代码可以加载并返回指定名称的类的Class对象。通过Class对象,我们可以获取类的构造器...

    Java反射机制讲义.docx

    Java反射机制是Java编程语言中的一个重要特性,它允许程序在运行时动态地获取类的信息,并且可以对类的成员变量和方法进行操作。这一机制使得Java具有了更强的灵活性和可扩展性,尤其是在处理插件化、框架设计、元...

    Java中的反射机制

    Java反射中的主要方法 针对构造函数、字段和方法这三种组件,`java.lang.Class`提供了多种反射调用来获取相关信息。例如: - `Constructor getConstructor(Class[] params)`:获取具有特定参数类型的公共构造函数...

Global site tag (gtag.js) - Google Analytics