一句话归纳就是使用反射能够赋予jvm动态编译的能力,不然类的元数据信息只能用静态编译的方式实现,例如热加载,Tomcat的classloader等等都无法支持html
Java中编译类型有两种:java
- 静态编译:在编译时肯定类型,绑定对象即经过。
- 动态编译:运行时肯定类型,绑定对象。动态编译最大限度地发挥了Java的灵活性,体现了多态的应用,能够减低类之间的耦合性。
Java反射是Java被视为动态(或准动态)语言的一个关键性质。这个机制容许程序在运行时透过Reflection APIs取得任何一个已知名称的class的内部信息,包括其modifiers(诸如public、static等)、superclass(例如Object)、实现之interfaces(例如Cloneable),也包括fields和methods的全部信息,并可于运行时改变fields内容或唤起methods。数组
Reflection能够在运行时加载、探知、使用编译期间彻底未知的classes。即Java程序能够加载一个运行时才得知名称的class,获取其完整构造,并生成其对象实体、或对其fields设值、或唤起其methods。jvm
反射(reflection)容许静态语言在运行时(runtime)检查、修改程序的结构与行为。
在静态语言中,使用一个变量时,必须知道它的类型。在Java中,变量的类型信息在编译时都保存到了class文件中,这样在运行时才能保证准确无误;换句话说,程序在运行时的行为都是固定的。若是想在运行时改变,就须要反射这东西了。ide
实现Java反射机制的类都位于java.lang.reflect包中:ui
一、Class类:表明一个类.net
二、Field类:表明类的成员变量(类的属性)htm
三、Method类:表明类的方法对象
四、Constructor类:表明类的构造方法blog
五、Array类:提供了动态建立数组,以及访问数组的元素的静态方法
* 对于修改静态常量类型是须要当心
对于基本类型的静态常量,JAVA在编译的时候就会把代码中对此常量中引用的地方替换成相应常量值
* 参考阅读http://www.imooc.com/learn/199https://blog.csdn.net/u010832551/article/details/74202467http://wiki.jikexueyuan.com/project/java-reflection/jave-guide.html