反射 reflection
反射机制就是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射制
主要是指程序可以访问,检测和修改它本身状态或行为的一种能力,并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义。
反射机制的作用:
1.静态编译:在编译时确定类型,绑定对象,即通过。
2.通过反射机制访问java对象的属性,方法,构造方法等;
优点
可以实现动态创建对象和编译,体现出很大的灵活性,特别是在J2EE的开发中它的灵活性就表现的十分明显。比如,一个大型的软件,不可能一次就把把它设计的很完美,当这个程序编译后,发布了,当发现需要更新某些功能时,我们不可能要用户把以前的卸载,再重新安装新的版本,假如这样的话,这个软件肯定是没有多少人用的。采用静态的话,需要把整个程序重新编译一次才可以实现功能的更新,而采用反射机制的话,它就可以不用卸载,只需要在运行时才动态的创建和编译,就可以实现该功能。
缺点
对性能有影响。使用反射基本上是一种解释操作,我们可以告诉JVM,我们希望做什么并且它满足我们的要求。这类操作总是慢于只直接执行相同的操作。
JAVA反射机制主要提供了以下功能:
1.在运行时判断任意一个对象所属的类
2.在运行时构造任意一个类的对象
3.在运行时判断任意一个类所具有的成员变量和方法(通过反射甚至可以调用private方法)
4.在运行时调用任意一个对象的方法(*****注意:前提都是在运行时,而不是在编译时)
Class类的API
方法关键字 含义
getDeclaredMethods() 获取所有的方法
getReturnType() 获得方法的反回类型
getParameterTypes() 获得方法的传入参数类型
getDeclaredMethod("方法名",参数类型.class,……) 获得特定的方法
构造方法关键字 含义
getDeclaredConstructors() 获取所有的构造方法
getDeclaredConstructor(参数类型.class,……) 获取特定的构造方法
父类和父接口 含义
getSuperclass() 获取某类的父类
getInterfaces() 获取某类实现的接口
获取字节码文件对象的三种方式。
2. ".class"------------- : 如果类型可用但没有对象,则可以在类型后加上".class"来获得Class对象。这也是使原始类型获得Class对象最简单的方式:
3."Class.forName()"---:如果知道类的全名,则可以使用静态方法Class.forName()来获得Class对象,它不能用在原始类型上,但是可以用在原始类型数组上。(注:此方式会抛出ClassNotFoundException异常)
4. "包装类的TYPE域"-----:每一个原始类型和void都有包装类。利用其TYPE域就可以获得Class对象。
5."以Class为返回值的方法": 如获取内部类的getDeclaredClasses()方法,此时返回一个对象数组
使用反射机制的步骤
首先: 导入java.lang.relfect 包
然后: 遵循三个步曲:
(1)获得你想操作的类的 java.lang.Class 对象
(2)调用诸如 getDeclaredMethods 的方法
(3)使用反射API 来操作这些信息