Java高级特性
第六章 反射机制
一、认识反射
1、反射机制
(1)Java的反射机制是Java的特性之一,反射机制是构建框架技术的基础所在。
(2)Java反射机制是指在运行状态中,动态获取信息以及动态调用对象方法的功能。
(3)Java反射有3个动态性质:
- 运行时生成动态实例;
- 运行期间调用方法;
- 运行时更改属性。
2、回顾Java程序的执行过程
3、反射执行过程
Java反射机制在编译时并不确定是哪个类被加载了,而是在程序运行时菜价在、探知、使用。
Java反射机制能够知道类的基本结构,这种对Java类结构探知的能力,称为Java类的“自审”。使用Eclipse时,java代码的自动提示功能就是利用了Java反射的原理,是对所创建的对象的探知和自审。
4、通过Java反射,可以实现以下功能
(1)在运行时判断任意一个对象所属的类;
(2)在运行时构造任意一个类的对象;
(3)在运行时判断任意一个类所具有的方法和属性;
(4)在运行时调用任意一个对象的方法。
二、Java反射常用API
1、使用Java反射技术常用的类
(1)Class类:反射的核心类,反射所有的操作都是围绕该类来生成的。通过Class类,可以获取类的属性、方法等内容信息。
(2)Field类:表示类的属性,可以获取和设置类中属性的值。
(3)Method类:表示类的方法,可以用来获取类中方法的信息,胡或者执行方法。
(4)Constructor类:表示类的构造方法。
2、在Java程序中使用反射的基本步骤
(1)导入java.lang.reflect.*。
(2)获得需要操作的类的java.lang.Class对象。
(3)调用Class的方法获取Field、Method等对象。
(4)使用反射API进行操作。
三、反射的应用
1、获取类的信息
(1)获取Class对象
方式一:直接通过对应普通类的 class 属性获得
Class userClass1 = User.class;
方式二:通过普通类对象的 getClass() 获得
User user = new User();
Class userClass = user.getClass()
(2)从Class对象获取信息
- 访问Class对应类所包含的构造方法
- 访问Class对应的类所包含的方法
- 访问Class对应的类所包含的属性
- 访问Class对应的类的其他信息
2、创建对象
获得 User 类型的 Class 对象
Class<User> userClass = User.class;
方式一: 通过反射机制获得无参数构造方法
Constructor<User> constructor = userClass.getDeclaredConstructor();
方式二:借助于 Constructor 创建对象
User user = constructor.newInstance();
3、访问类的属性
4、访问类的方法
在Method类中包含一个invoke()方法,方法定义如下:
Object invoke(Object obj,Object args)
四、反射机制的使用
虽然反射机制代码在正常项目中极少出现, 但是以下代码则可以将位于 src 内的文件变为输入流,会被经常使用到。
public static void main(String[] args) throws Exception {
InputStream in = MessageDemo.class.getClassLoader().getResourceAsStream(
"cn/ekgc/javasenior/day20210916/message.txt");
InputStreamReader isr = new InputStreamReader(in);
BufferedReader br = new BufferedReader(isr);
// 开始读取该文件
String message;
while ((message = br.readLine()) != null) {
System.out.println(message);
}
}