【大白话说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 等框架通过反射解析注解并执行相应逻辑。

    💡 面试官视角:

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

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

相关推荐
tyn1889 分钟前
记录本地安装nacos服务的方法及异常
java·开发语言
步行cgn43 分钟前
Spring MVC 视图机制的核心接口与类
java·开发语言·后端·spring·mvc
y1su1 小时前
Leetcode 字符串模板
java·数据结构·算法·leetcode·职场和发展·动态规划
传奇开心果编程1 小时前
【Rust入门练中学】第5课:引用与借用
开发语言·rust·引用·编程语言理论·通用编程语言·借用
码事漫谈1 小时前
AI 读你的提示词,其实很没耐心
后端
qetfw2 小时前
Bash 变量:export、位置参数与默认值展开验证
linux·开发语言·chrome·bash
爱上纯净的蓝天2 小时前
不用云做 RAG:一个本地笔记问答工具的取舍与坑
python·开源·大模型·rag·本地部署
电子云与长程纠缠2 小时前
UE5魂系游戏开发教程05
开发语言·学习·游戏·ui·ue5
cspttty2 小时前
2027风险管理岗准备路线:数学与应用数学如何补齐金融、SQL与Python
开发语言·python·金融
用户8356290780512 小时前
如何使用 Python 格式化 Excel 单元格中的长文本
后端·python