Java第五次博客作业:揭开 Java 反射机制的神秘面纱,让码“动”起来

平时我们写代码是“静态”的,编译时就知道要用哪个类;而反射允许我们在“运行时”才去决定用哪个类、调用哪个方法。今天这篇随笔,将拆解这个 Java 高级特性的核心逻辑。

  1. 什么是反射?为什么需要它?

在传统的编程模式中,如果我们想使用一个对象,必须先知道它的类名,然后 new 出来。

但是,如果需要根据用户的配置文件来决定加载什么类,这时候你就没法在代码里写死new XXX()  了。

反射机制就是为了解决这个问题而生的。它允许程序在运行状态中:

对于任意一个类,都能够知道这个类的所有属性和方法;
对于任意一个对象,都能够调用它的任意一个方法和属性。

这种动态获取信息以及动态调用对象方法的功能,就是 Java 语言的反射机制。

  1. 反射的三大核心入口

要实现反射,我们首先需要拿到类的“身份证”——也就是  Class  对象。获取它通常有三种方式:

类名.class:最安全、性能最好,适合在编译期就知道类名的情况。
Class<?> clazz = User.class;

对象.getClass():通过已经实例化的对象反向获取类信息。
User user = new User();
Class<?> clazz = user.getClass();

Class.forName("全限定类名"):这是反射最常用的方式。只需要一个字符串就能找到类,非常适合配合配置文件使用。
Class<?> clazz = Class.forName("com.example.User");

  1. 反射能做什么?

动态创建对象:不需要  new  关键字,直接通过 clazz.newInstance()  或构造器生成实例。

访问私有成员:这是反射最“霸道”的地方。通过  field.setAccessible(true) ,我们可以强行访问甚至修改类中的 private 变量。这在单元测试中非常有用。

动态调用方法:通过  method.invoke(obj, args) ,我们可以在运行时决定调用哪个方法,传入什么参数。

  1. 反射的代价

虽然反射很强大,但也不能滥用。因为它有两个明显的缺点:

性能开销:反射涉及动态解析,JVM 无法对这些代码进行优化(如内联缓存),所以执行速度比直接调用要慢很多。

安全隐患:它能破坏封装性(访问私有变量),如果不小心,可能会绕过安全检查,导致系统漏洞。

  1. 总结与思考

通过这次作业,我深刻理解了为什么 Spring、MyBatis 等主流框架都离不开反射。它们是构建“通用性”和“灵活性”的基石。

posted @ 2026-06-08 23:10  定缘  阅读(12)  评论(0)    收藏  举报