在java运行时获取任意一个类的属性、方法、构造函数,并可以修改属性、调用方法、创建对象,这种动态获取类的信息以及动态调用对象的方法的功能来自于java语言的反射机制。
Reflection是java被视为动态(或准动态)语言的一个关键性质。这个机制允许程序在运行时透过Reflection API取得任意一个已知名称的class的内部信息。
一般而言,开发者社群说到的动态语言,大致认同的一个定义是:“程序在运行时,允许改变程序结构或变量类型,这种语言称为动态语言”。从这个观点来看,Perl,Python,Ruby是动态语言,C++、java、C#不是动态语言。
尽管在这样的定义与分类下java不是动态语言,它却有着一个非常突出的动态相关机制:Reflection。这个词的意思是“反射、映像、倒影”,用再java身上指的是我们可以于运行时加载、探知、使用编译期间完全未知的classes。换句话说,java程序可以加载一个运行时才得知名称的class,获悉其完整结构(但不方法体),并生成其对象实体、或对其fields设置、或唤起其methods。这种“看透class”的能力被称为introspection(内省、内观、反省)。
Reflection和introspection是常被并提的两个术语。
Class是Reflection的基石,针对任何你想透视的类,唯有先为它产生一个Class对象,接下来才能经由后者唤起为数十多个的Reflection APIs.
得到途径有三种:getClass(),Class.forName,ClassgetSuperclass()。