编译类型与运行类型:
Java中的许多对象(一般都是具有父子类关系的父类对象)在运行时都会出现两种类型:编译时类型和运行时类型,例如:Person person = new Student();这行代码将会生成一个person变量,该变量的编译时类型是Person,运行时类型是Student。
import java.util.Date; public class ReflectTest { public static void main(String[] args){ //编译类型为Object Object object = null; //运行类型为Date,理解:程序运行时,变量真实对应的类型 object = new Date(); //object.getDay();此时处于编译期,无法使用。 //反射是运行期的一种特性,可以操作“运行类型”的对象。 } }
JAVA反射(放射)机制:
“程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言”。从这个观点看,Perl,Python,Ruby,JavaScript是动态语言,C++,Java,C#不是动态语言。
比如(javascript):var username;
username="xxx";
username=250;
但是JAVA有着一个非常突出的动态相关机制:Reflection(反射),用在Java身上指的是我们可以于运行时加载、探知、使用编译期间完全未知的class。换句话说,Java程序可以加载一个运行时才得知名称的class,获悉其完整构造方法(但不包括methods定义),并生成其对象实体、或对其fields设值、或唤起其methods。
反射(reflection)定义:
在运行时期,动态地去获取类中的信息(类的信息,方法信息,构造器信息,字段等信息);
比如类的信息:public、private等
JVM加载类字节文件时,会创建一个对象(Class类型),反射就是去获取这个对象,从而就知道类中的信息。
Java中的许多对象(一般都是具有父子类关系的父类对象)在运行时都会出现两种类型:编译时类型和运行时类型,例如:Person person = new Student();这行代码将会生成一个person变量,该变量的编译时类型是Person,运行时类型是Student。