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对象都是同一个对象。

Java中的高级特性--反射

7、newInstance():获取Class对象之后,实例化类的方法。

     public T newInstance(){}

      返回值类型为 T,一般会用 object 接收。

       注意:该方法实例化对象调用的是默认的无参构造。如果Class对象中有其他的构造方法,该方法就会失灵,此时需要中取得该Class对象的构造方法之后,才能实例化对象。