java-反射深度剖析

此页面是否是列表页或首页?未找到合适正文内容。

java-反射深度剖析

标签:paramboard破解结构win多个comment例子author

Java反射是Java语言一个很重要的特征,简单剖析下反射的定义、原理、使用、性能及应用场景。

(一)定义

程序运行时,允许改动程序结构或变量类型,这种语言称为动态语言。java不属于动态语言,但提供了RTTI(Run-time Type Identification)运行时类别识别。RTTI分为两种方式,一种是编译运行时已知悉类型,一种是反射机制。

(二)原理

在《深入java虚拟机》中提到,java文件被编译成class文件,JVM类加载器加载class字节码到方法区,然后在堆中生成Class类,Class类可以访问到类的基本信息,如类简单名、类包含路径全名、访问修饰符、字段、方法等信息。

反射中需要使用到的类:

Field类:提供有关类或接口的属性的信息,以及对它的动态访问权限。反射的字段可能是一个类(静态)属性或实例属性,简单的理解可以把它看成一个封装反射类的属性的类。Constructor类:提供关于类的单个构造方法的信息以及对它的访问权限。这个类和Field类不同,Field类封装了反射类的属性,而Constructor类则封装了反射类的构造方法。Method类:提供关于类或接口上单独某个方法的信息。所反映的方法可能是类方法或实例方法(包括抽象方法)。Class类:类的实例表示正在运行的 Java 应用程序中的类和接口。枚举是一种类,注释是一种接口。每个数组属于被映射为 Class 对象的一个类,所有具有相同元素类型和维数的数组都共享该 Class 对象。

(三)使用

(1)获取Class

方法一:Class c=Class.forName(\”java.lang.String\”)方法二:对于基本数据类型可以用形如Class c=int.class或Class c=Integer.TYPE的语句

(tips:int.class = Integer.TYPE !=Integer.class)

方法三:Class c=MyClass.class

(2)调用Class中的方法得到你想得到的信息集合,如调用getDeclaredFields()方法得到类所有的属性

[java]view plaincopy

  • Fieldfield=classInstance.getDeclaredField(\”TEST_TIMES\”);
  • inttimes=(Integer)field.get(classInstance);
  • System.out.println(times);
  • (四)性能

    反射的性能是低于直接调用的,下次通过测试验证这个结果,测试中尽量避免对象创建等干扰因素。

    我们将测试直接访问的耗时、直接反射的耗时、缓存需要查找的函数反射的耗时、使用ReflectAsm的反射耗时。

    [java]view plaincopy

  • /**
  • *测试反射性能
  • *
  • *@authorpeter_wang
  • *@create-time2014-6-13下午12:54:52
  • */
  • publicclassReflectPerformanceDemo{
  • privatestaticfinalintTEST_TIMES=1000000;
  • privatelongmNum;
  • privatelongmSum;
  • /**
  • *@paramargs
  • 作者: 安兔兔

    为您推荐

    返回顶部