一、引言
在 Java 生态中,反射与动态代理是支撑框架设计的基石,无论是 Spring 中的 AOP,还是 Mybatis 的 Mapper 接口,都离不开这两项技术。在学习之前先了解反射和动态代理分别可以做什么,简单说反射赋予程序'看清类结构'的功能,通过反射可以知道类中构造方法,成员方法,成员变量等信息;动态代理则实现了'无侵入式增强',二者相辅相成,让代码具备灵活性与扩展性。
二、Java 反射:探索类的'隐藏世界'
2.1 反射的定义
在 Java 中,反射(Reflection)是一种强大的机制,允许程序在运行时检查或修改其自身的结构和行为。通过反射,你可以查询类的元数据(如类名、方法、字段、注解等),动态地进行创建对象,调用方法,访问字段等操作。
2.2 反射的核心 API
Java 反射的核心操作集中在 java.lang.reflect 包中,其中关键类包括 Class、Method、Field、Constructor,核心操作分为'获取 Class 对象''操作类成员'两步
(1) 如何获取类对象?
首先在这里定义一个 User 类
public class User {
private String name;
public Integer age;
public User() {}
private User(String name) {
this.name = name;
}
public String getName() {
return name;
}
private void setAge(Integer age) {
this.age = age;
}
}
获取类对象有三种方式分别是:类名.class,对象.getClass(),Class.forName('全类名')
// 1. 类名.class(编译时确定,最高效)
Class<?> class1 = User.class;
System.out.println(class1); // class User
// 2. 对象.getClass() (运行时获取,需要实例化)
User user = new User();
Class<?> class2 = user.getClass();
System.out.println(class2); // class User
// 3. Class.forName("全类名") (运行时加载,最灵活)
Class<?> class3 = Class.forName();
System.out.println(class3);
System.out.println(class1.equals(class2));

