Java中的高级特性--反射
反射是框架设计的灵魂
1、概念
反射(Reflection)机制就是将类的各个组成部分封装为其他的对象,并且能够动态的获取类的信息和动态的调用对象方法。
使得能够在Java程序运行状态下,能够知道任意一个类的属性和方法,并且对于任意一个对象都能够调用它的任意的属性和方法。
2、反射机制的主要功能
(1)在运行状态下判断任意一个对象属于哪一个类;
(2)在运行那个状态下创建任意一个类对象;
(3)在运行状态下获取任意一个类的属性和方法;
(4)在运行状态下调用任意一个对象的属性和方法。
3、反射的优点
(1)可以在程序的运行过程中操作对象;
(2)可以实现解耦,提高程序的可扩展性。
4、与Java反射机制相关的类
(1)Class类:代表一个类实体;
(2)Field类:代表类的属性;
(3)Method类:代表类的方法;
(4)Constructor类:代表类的构造方法;
(5)Array类:提供了动态创建数组的方法和访问数组的静态方法。
5、Class对象的功能
JVM会为每一个类都生成一个Class对象,对于任意一个类来说,无论生成多少个该类的对象,所有的对象都只对应于同一个Class对象。
(1)获取成员变量
Field[] getFields():获取所有 public 修饰的成员变量;
Field getField(String name):获取指定对象的成员变量;
Field[] getDeclaredFields() :获取所有成员,不考虑修饰符;
Field getDeclaredField(String name):获取指定的成员变量。
(2)获取构造方法
Constructor<?>[] getConstructors()
Constructor<T> getConstructor(class<?>... parameter Types)
Constructor<T> getDeclaredConstructor(class<?>,,,parameter Types)
Constructors<?>[] getDeclaredConstructor()
(3)获取成员方法
Method[] getMethods()
Method getMethod(String name,class<?> parameter Types)
Method[] getDeclaredMethods()
Method getDeclaredMethod(String name,class<?> pararmeter Types)
6、获取Class对象的三种方法
(1)Class.forName(" 全类名 " ):将字节码加载进内存,返回Class对象;
该方式多用于配置文件,将类名定义在配置文件中。
(2)类名.class : 通过类名的class属性获取;
该方式多用于参数传递中。
(3)对象.getClass() :getClass方法定义于Object中,并且声明为final类型,不能被子类重写。
该方式多用于对象的获取字节码的方式。
注意:同一个字节码文件(*.class)在一次程序运行过程中,只会被加载一次,不论通过那一种方式获取的Class对象都是同一个对象。
7、newInstance():获取Class对象之后,实例化类的方法。
public T newInstance(){}
返回值类型为 T,一般会用 object 接收。
注意:该方法实例化对象调用的是默认的无参构造。如果Class对象中有其他的构造方法,该方法就会失灵,此时需要中取得该Class对象的构造方法之后,才能实例化对象。