面试题:简述什么是 Java 反射 ?

Java 反射(Reflection)是 Java 提供的一种机制,允许程序在运行时动态地获取类的信息(如类名、方法、属性、构造器等),并能够操作这些信息。通过反射,可以在运行时创建对象、调用方法、访问或修改字段,甚至调用私有成员。

反射的核心类是 java.lang.reflect 包中的以下类:

  • Class 类:表示一个类或接口,是反射的核心。
  • Method 类:表示类的方法。
  • Field 类:表示类的字段(属性)。
  • Constructor 类:表示类的构造方法。

反射的主要功能

  1. 获取类的信息
    • 获取类名、父类、接口、修饰符等信息。
    • 获取类的字段、方法、构造器等。
  2. 动态创建对象
    • 通过 Class.newInstance() 或 Constructor.newInstance() 创建类的实例。
  3. 动态调用方法
    • 通过 Method.invoke() 调用类的方法,包括私有方法。
  4. 访问和修改字段
    • 通过 Field.get() 和 Field.set() 访问或修改类的字段,包括私有字段。
  5. 操作泛型
    • 通过反射可以获取泛型类型信息。

反射的优缺点

优点:

  • 灵活性:可以在运行时动态操作类和对象,适合框架和工具的开发(如 Spring、Hibernate)。
  • 扩展性:可以通过配置文件或外部输入动态加载类。

缺点:

  • 性能开销:反射操作比直接调用方法或访问字段慢,因为需要动态解析类信息。
  • 安全性问题:反射可以访问私有成员,破坏了封装性。
  • 代码可读性差:反射代码通常难以理解和维护。

示例代码

import java.lang.reflect.Method;

public class ReflectionExample {
    public static void main(String[] args) throws Exception {
        // 获取类的 Class 对象
        Class<?> clazz = Class.forName("java.util.ArrayList");

        // 创建对象
        Object list = clazz.getDeclaredConstructor().newInstance();

        // 获取 add 方法
        Method addMethod = clazz.getMethod("add", Object.class);

        // 调用 add 方法
        addMethod.invoke(list, "Hello, Reflection!");

        // 打印结果
        System.out.println(list); // 输出: [Hello, Reflection!]
    }
}
THE END
点赞15 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容