在Java运行时环境中,对于任何一个类,都可以知道这个类有哪些属性和方法,对于任何一个类,
也能调用它的任意一个方法。这种动态获取类的信息以及动态调用对象的方法的功能来自Java语言的
反射(Reflection)机制
Java反射机主要提供了以下几个功能:
1、在运行时判断任意一个对象所属的类
2、在运行时构造任意一个类的对象。
3、在运行时判断任意一个类所具有的成员变量和方法
4、在运行时调用任意一个对象的方法
Reflection是Java被视为动态(或准动态)语言的一个关键性质。这个机制允许程序在运行时透过
Reflection APIs取得任何一个已知名称的class的内部信息,包括其modifiers(public,static等等)、
superclass(如Object),实现的interfaces,也包括fields和methods的所有信息,并可于运行时改变
fields内容或调用methods。
一般而言,开发者社群说到动态语言,大致认同的一个定义是:程序在运行时,允许翻遍程序结
构或变量类型,这种语言成为动态语言。从这个观点看,Perl,Python,Ruby是动态语言,C++,
Java,C#是不是动态语言。
尽管在这样的定义与分类下Java不是动态语言,它却有着一个非常突出的动态相关机制:Reflection。
用在Java身上指的是我们可以在运行时加载、探知、使用编译期间完全未知的classes。Java程序可以
加载一个运行时才得知名称的class,获悉其完整构造,并生成其对象实体、或对其fields设置、或唤起
其methods。这种“看透class”的能力被称为introspection。Reflection和introspection是常被并提的两个术
语。
在JDK中,主要由一下类来实现Java反射机制,这些类都位于java.lang.reflect包中
1、Class类:代表一个类
2、Field类:代表类的成员变量
3、Method类:代表类的方法
4、Constructor类:代表类的构造方法
5、Array类:提供了动态创建数组,以及访问数组的元素的静态方法
当一个class被加载,或当加载器(class loader)defineClass()被JVM调用,JVM便自动产生
一个Class object。如果想借由“修改Java标准库源码”来观察Class object的实际生成时机,不能够!
因为Class并没有public constructor。
Class是Reflection起源。针对任何您想探勘的class,唯有先为它产生一个Class object,接下来
才能经由后者唤起为数十多个的Reflection APIs。