【大白话说Java面试题】【Java基础篇】第39题:说说反射的用途及实现原理,Java获取反射(Class)的三种方法

📌 专栏 :大白话说Java面试题 --- 01-Java基础篇

第39题:说说反射的用途及实现原理,Java获取反射(Class)的三种方法

📚 回答:

  • 什么是反射?
    Java 的反射机制允许程序在运行时动态获取类的信息(如构造方法、成员变量、方法等),并动态调用对象的功能。这种能力使得程序更加灵活,能够处理未知类型的对象。

1. 反射的实现原理
  • 编译阶段

    • Java 程序在编译后会生成 .class 文件,这些文件包含了类的元信息(如类名、字段、方法等)。
  • 运行阶段

    • 当程序运行时,JVM 会将 .class 文件加载到内存中,并为每个类生成一个 Class 对象。
    • 通过 Class 对象,可以获取类的构造方法(Constructor)、成员变量(Field)、方法(Method)等信息,并动态操作这些内容。

2. 获取 Class 对象的三种方法
  • 方法1:通过类名获取

    java 复制代码
    Class<?> clazz = String.class;
  • 方法2:通过类路径获取

    java 复制代码
    Class<?> clazz = Class.forName("java.lang.String");
  • 方法3:通过实例化对象获取

    java 复制代码
    String str = "Hello";
    Class<?> clazz = str.getClass();

    💡 代码示例

    以下代码展示了如何通过反射创建对象并调用方法:

java 复制代码
import java.lang.reflect.Method;

class Person {
    private String name;

    public Person() {}

    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}

public class Main {
    public static void main(String[] args) throws Exception {
        // 获取 Class 对象
        Class<?> clazz = Class.forName("Person");

        // 创建实例
        Object obj = clazz.getDeclaredConstructor().newInstance();

        // 获取方法并调用
        Method setName = clazz.getMethod("setName", String.class);
        setName.invoke(obj, "Alice");

        Method getName = clazz.getMethod("getName");
        System.out.println(getName.invoke(obj)); // 输出 Alice
    }
}

3. 反射的应用场景
  • 框架开发

    • Spring 的 IoC 容器通过反射动态创建对象并实现依赖注入。
    • Spring MVC 通过反射调用控制器中的方法。
  • 动态代理

    • JDK 动态代理底层依赖反射机制。
  • JDBC 驱动加载

    • 使用 Class.forName() 加载数据库驱动(如 MySQL 驱动)。
  • 注解解析

    • 如 JUnit、Spring 等框架通过反射解析注解并执行相应逻辑。

    💡 面试官视角

  • 面试官可能会问"反射的优缺点是什么?"答:

    • 优点:灵活性高,能够动态操作类和对象。
    • 缺点:性能较低,破坏封装性,可能导致安全隐患。
  • 面试官可能会追问"如何提高反射性能?"答:可以通过缓存 MethodField 等对象减少重复获取的开销。

相关推荐
PILIPALAPENG1 小时前
第4周 Day 2:多步推理 Agent——让 Agent 学会"先想再干"
前端·人工智能·python
AIminminHu1 小时前
(让 C++ 程序长出大脑:从“语音遥控器”到具身智能 Agent 的进化之路)------OpenGL渲染与几何内核那点事------(二-1-(15))
开发语言·c++·agent·具身智能
江南十四行1 小时前
网络编程基础:TCP/IP与Socket编程详解
网络·python·http
PeterLi1 小时前
踩坑实录:JRebel 启动报 Mapper 重复 ID 异常,IDEA 普通启动却正常?
java·后端
神明9311 小时前
mysql索引排序规则设置方法_mysqlCollation对索引影响
jvm·数据库·python
Project_Observer1 小时前
使用Zoho Projects记录工时时间后自动更新项目预算。
开发语言·数据库·人工智能·深度学习·机器学习
甲维斯1 小时前
搞定了!任意模型接入Claude Desktop,提前用上“Opus5.0”
后端
hixiong1231 小时前
C#文件目录结构生成工具
开发语言·c#
神明9311 小时前
CSS如何实现打字机效果_利用animation与宽度变化
jvm·数据库·python