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
(四)性能
反射的性能是低于直接调用的,下次通过测试验证这个结果,测试中尽量避免对象创建等干扰因素。
我们将测试直接访问的耗时、直接反射的耗时、缓存需要查找的函数反射的耗时、使用ReflectAsm的反射耗时。
[java]view plaincopy