Java 反射机制

一、Java反射机制定义

运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。运行状态,如下图红框所示。

反射的实质:在运行状态下,通过类的class字节码,获取类的实例、成员变量和方法

图1 Java编译运行过程

说明1:Java有两种状态。1.编译时:通过 javac 命令,生成一个或多个.class字节码文件(每个.class字节码文件对应一个类);2.运行时:通过 java 命令,将一个或多个.class字节码文件加载到内存中(由JVM提供的类加载器完成)。

说明2:对比正常实例化对象和反射机制实例化对象

图2 实例化对象

二、Java反射机制的功能及API

2.1 Java反射机制的功能

1. 在运行时判断任意一个对象所属的类

2. 在运行时构造任意一个类的对象

3. 在运行时判断任意一个类所具有的成员变量和方法

4. 在运行时调用任意一个对象的成员变量和方法

2.2 Java反射机制的API

java.lang.Class:代表一个类

java.lang.reflect.Method:代表类的方法

java.lang.reflect.Field:代表类的成员变量

java.lang.reflect.Constructor:代表类的构造方法

三、Java反射机制的实例化对象

实例化Class类对象的四种方法:

1. Class clazz = String.class;   

// 若已知具体的类,通过类的class属性获取,该方法最为安全可靠,程序性能最高

2. Person person = new Person();Class clazz = person.getClass();

// 已知某个类的实例,调用该实例的getClass()方法获取Class对象

3. String className = “java.lang.String”;Class clazz = Class.forName(className);

// 已知一个类的全类名,且该类在类路径下,可通过Class类的静态方法forName()获取,可能抛ClassNotFoundException

4. ClassLoader cl = this.getClass().getClassLoader();Class clazz = cl.loadClass(“类的全类名”);

// 通过类加载器来获取

图3 类加载全过程

你可能感兴趣的:(Java 反射机制)