声明:如需转载请说明地址来源:http://www.cnblogs.com/pony1223
反射一 基本概念
一、反射机制的基本概念
什么是反射?反射是指在运行状态中,对于任意一个类,都可以获取到这个类的所有属性和方法;对于任意一个对象,都能够调用这个对象的任意方法和属性;这种动态获取信息及动态调用对象的方法,称为JAVA语言的反射机制。
二、反射可以做什么
我知道了反射的概念,那么反射可以做什么呢?
- 在运行时可以判断任意一个对象是否属于所属的类
- 在运行期可以构造任意一个对象
- 在运行期可以获取一个类的成员变量或者方法
- 在运行期可以去调用一个对象的方法
三、反射的相关类
在JDK 中,主要有以下类来实现JAVA反射机制,这些类(除了第一个)都位于java.lang.reflect包中
Class类:代表一个类,位于java.lang包下。
Field类:代表类的成员变量(成员变量也称为类的属性)。
Method类:代表类的方法。
Constructor类:代表类的构造方法。
Array类:提供了动态创建数组,以及访问数组的元素的静态方法。
四、反射的基本原理
要实现反射功能,那么需要经过加载类,和解析类两个步骤;所谓加载类,即将类的字节码加载到内存中去,然后去解析这个类,从而得到所要的属性或者方法。
例如:用于反射的类,如Method,可以在java.lang.reflect包中找到。使用这些类的时候必须要遵循三个步骤:
第一步:获得你想操作的类的java.lang.Class对象。在运行中的Java程序中,用java.lang.Class类来描述类和接口等。
第二步:调用诸如getDeclaredMethods的方法,取得该类中定义的所有方法的列表。
第三步:使用反射的API来操作这些信息。
五、加载类,即获取Class对象的三种方式
1.使用Class类的静态方法。例如:
Class.forName("java.lang.String");
2.使用类的.class语法。如:
String.class;
3.使用对象的getClass()方法。如:
String str = "aa";
Class<?> classType1 = str.getClass();
getClass()方法定义在Object类中,不是静态方法,需要通过对象来调用,并且它声明为final,表明不能被子类所覆写。
直接print所获得的Class对象classType会输出:
class 完整类名
如果调用该Class对象的getName()方法,则输出完整类名,不加class。
六、实例演示
package study.reflect; public class Demo01 { /** * 反射,加载类,获取类的字节码 * @param args * @throws Exception */ public static void main(String[] args) throws Exception { //1. Class<?> clazz = Class.forName("study.reflect.Person"); //2. Class<?> clazz1 = new Person().getClass(); //3. Class<?> clazz2 = Person.class; /** * 通过上面的三种方式,加载类已经完成,获取到了类的字节码,那么Class 提供了那些方法呢? * public Constructor<T> getConstructor(Class<?>... parameterTypes) public Method getMethod(String name,Class<?>... parameterTypes) public Field getField(String name) * * 也就说,和定义里面说的一样,我们可以拿到类的属性,方法 ,构造函数等相关的东西 * * */ } }
七、思考,我们解剖出了这些成员后有什么用呢?
提示:构造函数,创建对象;属性,用于保存数据;方法,可以执行某些功能。