【大白话说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 等对象减少重复获取的开销。

相关推荐
投图匠9 小时前
十种不同风格的 CTP接口 框架
开发语言·python
皮皮林5519 小时前
比 Xshell 还好用的 SSH 客户端神器,MobaXterm 太爱了!
后端
吴名氏.10 小时前
Java转AI Agent教程(第十三周)混合检索与重排
java·数据库·人工智能·ai·ai agent
我不会起名字32211 小时前
会话缓存失效排查:区分 Redis 失效与节点广播
redis·后端·go·即时通讯·im·故障排查
.痞老板.11 小时前
java ee--多线程(进阶)
java·java-ee
2601_9679801111 小时前
深入理解词向量算法及其在Python中的实践
python·word2vec·glove·fasttext·词向量
129Lab11 小时前
电池循环测试数据自动化分析:用Python+AI工具构建一键式寿命评估流水线
python·数据分析·电池测试·数据自动化·寿命评估
treasure14011 小时前
【复古】浅尝Django前后端不分离
前端·css·python·django·bootstrap·html·web
Dmz丶12 小时前
前端转 AI 100 天 Day 44:前端集成实战——用 React 给 Agent 做个正式界面
python
深入云栈12 小时前
Netty 4.2.x 源码深度解析 (二十三):ByteBuf 核心设计 —— 索引、类型与零拷贝
java·后端·架构