七、java反射机制

41 阅读4分钟

1、 文章背景

周末忙着陪未来的岳父岳母,又断更了...,兄弟们,我要结婚了。但也不影响继续写文章的决心,路还很长,加油!

2、 反射的概述

摘要:Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性‌。

什么是反射

Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制。反射机制主要提供了以下功能:

  • 在运行时判断任意一个对象所属的类
  • 在运行时构造任意一个类的对象
  • 在运行时判断任意一个类所具有的成员变量和方法
  • 在运行时调用任意一个对象的方法
  • 生成动态代理

3、Class类对象

在面向对象的世界里,万事万物皆对象。

在java的世界里,有两样不是对象,基本数据类型与java静态的东西,但是基本数据类型有封装类型,弥补了基本数据类型的不足。

这里解释一个问题,Java对象8种基本数据类型进行封装的原因:

  • 因为封装的数据类型是一个对象,可以拥有属性和方法,有了这些属性和方法就可以用它们来处理数据, 比如Integer对象里的parseInt(String s),可以把字符串转换成int类型等。
  • Java是一门面向对象的语言,到处是对象,有时候我们传递的值应该是对象类型。
  • 封装类型弥补了基本数据类型的一些不足。

类是对象,类是java.lang.Class的实例对象。

4、反射相关API

  • java.lang.Class类: 是Java反射机制的核心类,它代表了Java类的属性和方法,并包含了类的相关信息,比如类的名字、父类以及接口等信息。Class类的对象由JVM自动生成,当JVM加载某个类时,它会自动产生这个类对应的Class对象,并通过类名.class来获取该对象。

  • java.lang.reflect包: 提供了进行反射操作的一系列类和方法,主要包括以下几个类:

    • Field:表示类的成员变量(属性)。
    • Method:表示类的方法。
    • Constructor:表示类的构造方法。
    • Array:提供了动态创建数组和访问数组元素的静态方法。
  • 基本用法示例

    • 获取Class对象
    Class<?> c1 = Class.forName("com.example.MyClass"); // 注意处理ClassNotFoundException
    Class<?> c2 = MyClass.class;
    Class<?> c3 = new MyClass().getClass();
    
    • 创建实例
    Class<?> c = Class.forName("com.example.MyClass");
    Object obj = c.newInstance(); // 注意处理InstantiationException, IllegalAccessException
    
    • 获取并调用方法
    Method method = c.getMethod("myMethod", String.class); // 获取名为myMethod,参数为String的方法
    Object result = method.invoke(obj, "argument"); // 调用方法,传入实例和参数
    
    • 获取并修改字段
    Field field = c.getDeclaredField("myField"); // 获取名为myField的字段
    field.setAccessible(true); // 设置为可访问,忽略private修饰符
    field.set(obj, "newValue"); // 设置字段的值
    

5、使用场景

  • 框架设计:许多框架(如Spring)通过反射机制来实现依赖注入和AOP等功能。
  • 工具类:例如ORM框架,通过反射将数据库表的记录映射为Java对象。
  • 动态加载类和动态代理:在需要根据条件动态加载类或者创建代理对象时,反射是非常有用的。

注意事项

  • 性能开销:反射相比直接代码调用有一定的性能开销,因为涉及到类型解析、安全检查等。
  • 安全性:反射破坏了封装性,可能会带来潜在的安全问题。使用时需要确保对类的结构和行为有足够的了解。
  • 兼容性:随着Java版本的更新,反射API可能会有所改变,需要注意兼容性问题。

Java反射机制为开发者提供了极大的灵活性,但同时也需要谨慎使用,以避免潜在的性能和安全问题。

6、反射优缺点

  • 优点

    • 动态性‌:允许在运行时动态地操作类的属性、方法和构造方法,提供更大的灵活性和可扩展性‌。
    • 提高代码复用率‌:通过反射,可以实现动态代理、Spring管理bean等,提高代码的复用率‌。
    • 框架开发基础‌:反射是许多框架和工具的基础,使框架具有更高的灵活性和可配置性‌。
    • 调试和测试‌:反射机制可以在调试和测试阶段提供更多的信息和功能,方便进行调试和测试‌。
  • 缺点

    • 性能损耗‌:反射调用方法比直接调用要慢,因为涉及到动态类型的解析‌。
    • 可读性和可维护性下降‌:使用反射后,代码的可读性和可维护性会下降,因为反射代码通常更难理解和维护‌。
    • 安全问题‌:反射可以绕过访问控制,可能会导致安全问题‌。