1.1 Java反射概念
概念:反射(Reflection)机制是Java语言特性之一,是Java被视为动态(获准动态)语言的一个关键特性。
作用:之前我们所运行的程序都是在编译之前就已经链接了所有所需的类,而Java反射机制则允许程序在运行时在加载、探知,使用那些在编译时完全未知的类
1.1.1 什么是反射
1、概念:在计算机领域,反射是指一种能力,能够自描述和自控制,即在运行状态中,动态获取类信息及信息动态调用实例方法的能力
2、三个动态特性:
①运行时创建动态特性
②运行期间调用方法
③运行时更改属性
3、Java程序执行过程:
Person.java → 编译器 → Person.class → Java虚拟机 → 运行程序
1.1.2 Java反射常用API
常用类:
①java.lang.Class<T>类:反射的核心类,反射所有的操作都是围绕该类来生
成的。通过Class类可以获取类的属性、方法等内容信息
②java.lang.reflect.Constructor<T>类:表示类的构造方法
③java.lang.reflect.Field类:表示类的属性,可以获取和设置类中属性的值
④java.lang。Method类:表示类的方法,可以用来获取类中的方法的信息或
者执行方法
1.2 反射的应用
使用的基本步骤:
(1)导入java.lang.reflect包中的相关类
(2)获得需要操作的类的Class实例
(3)调用Class实例的方法获取Filed、Method等实例
(4)使用反射API操作实例成员
1.2.1 获取类的信息
1、获取Class实例
①调用类或接口实例的getClass()方法
②调用类或接口的class属性
③使用Class.forName()方法
2、从Class实例获取信息
①获取对应类型的基本信息
表 1-1获取对应类型基本信息的方法
方法 |
说明 |
String getName() | 以字符串形式返回该类型的名称 |
String getSimpleName() |
以字符串形式返回该类型的简称 |
Package getPackage() |
获取该类型所在的包 |
Class getSuperclass() |
返回该类型的超类的Class实例 |
Class[ ] getInterfaces() |
返回该类型所实现的全部接口的Class实例 |
int getModifiers() | 返回该类型的所有修饰符,由public、 protected、private、final、staic、abstract 等对应的int常量组成,返回的整数应使用Modifier工具类来解码,才可以判断修饰符的构成 |
Class[ ] getDeclaredClasses() |
返回该类型中包含的全部内部类的Class实例 |
Class getDeclaringClass() | 返回该类型所在的外部类的Class实例 |
通过反射获取类的类型信息代码:
package test;
import reflect.entity.Person;
import java.lang.reflect.Modifier;
public class PersonTest2 {
public static void main(String[] args) {
Class clz = Person.class;
String fullName = clz.getName();
String simpleName = clz.getSimpleName();
System.out.println("以下是 " + fullName + " 类的基本信息");
System.out.println("--------------------------");
// 获取Person类所在包
Package pkg = clz.getPackage();
System.out.println(simpleName + " 定义在:" + pkg.getName() + " 包中");
Syst