从 0 学 Java(22):JDK 反射 API 详解

反射是 Java 在运行时动态获取类信息并操作类成员的核心技术。以下详细解析三个核心类:


1. Class 类

作用:类的运行时元数据载体
获取方式

// 1. 类名.class
Class<?> clazz1 = String.class;

// 2. 对象.getClass()
String str = "hello";
Class<?> clazz2 = str.getClass();

// 3. Class.forName()
Class<?> clazz3 = Class.forName("java.lang.String");

关键方法

// 获取类名
String className = clazz1.getName(); // "java.lang.String"

// 获取父类
Class<?> superClass = clazz1.getSuperclass(); // Object.class

// 获取接口
Class<?>[] interfaces = clazz1.getInterfaces(); // [CharSequence, ...]

// 创建实例
Object obj = clazz1.newInstance(); // 调用无参构造


2. Constructor 类

作用:操作类的构造方法
获取方式

// 获取所有公共构造方法
Constructor<?>[] publicConstructors = clazz1.getConstructors();

// 获取指定参数类型的构造方法
Constructor<?> specificConstructor = clazz1.getConstructor(String.class);

关键方法

// 创建对象
String instance = (String) specificConstructor.newInstance("反射创建");

// 获取参数类型
Class<?>[] paramTypes = specificConstructor.getParameterTypes(); // [String.class]

// 获取修饰符
int modifiers = specificConstructor.getModifiers(); 
String modifierStr = Modifier.toString(modifiers); // "public"


3. Method 类

作用:操作类的方法
获取方式

// 获取所有公共方法(含继承方法)
Method[] publicMethods = clazz1.getMethods();

// 获取指定方法(含参数类型)
Method lengthMethod = clazz1.getMethod("length");
Method substringMethod = clazz1.getMethod("substring", int.class, int.class);

关键方法

// 调用方法
String s = "hello";
int len = (int) lengthMethod.invoke(s); // 5
String sub = (String) substringMethod.invoke(s, 1, 3); // "el"

// 获取返回类型
Class<?> returnType = lengthMethod.getReturnType(); // int.class

// 获取方法名
String methodName = lengthMethod.getName(); // "length"


反射应用场景
  1. 动态代理:AOP 实现的核心
  2. 框架设计:Spring 的依赖注入
  3. 序列化工具:JSON 库解析对象
  4. 插件系统:运行时加载扩展类

注意事项

  • 反射会绕过访问修饰符限制(可通过 setAccessible(true)
  • 频繁反射调用影响性能(约比直接调用慢 10-100 倍)
  • Java 9+ 模块化系统需额外配置 opens 指令

完整示例

// 动态调用 String.substring()
Class<?> clazz = Class.forName("java.lang.String");
Object str = clazz.getConstructor(String.class).newInstance("Reflection");
Method method = clazz.getMethod("substring", int.class);
Object result = method.invoke(str, 3);
System.out.println(result); // 输出 "ection"

掌握反射 API 是进阶 Java 高级开发的必备技能,后续将结合动态代理深入讲解实际应用场景。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐