Java反射机制允许运行时动态获取类信息、创建对象和调用方法,无需编译期确定类型;核心是通过Class对象操作类结构,获取方式包括类名.class、对象.getClass()和Class.forName("全限定类名")。

Java 反射机制允许在运行时获取类信息、创建对象、调用方法,无需编译期就确定具体类型。核心是通过 Class 对象操作类的结构。
获取 Class 对象
有三种常用方式,本质相同,任选其一即可:
-
类名.class:最安全高效,适用于编译期已知类(如
String.class) - 对象.getClass():适用于已有实例,注意 null 会抛 NPE
-
Class.forName("全限定类名"):动态加载类,会触发静态初始化块,常用于配置驱动(如
Class.forName("com.mysql.cj.jdbc.Driver"))
动态创建对象
需确保目标类有可访问的无参构造器(或指定参数构造器):
- 调用
clazz.getDeclaredConstructor().newInstance()—— 推荐方式,支持私有构造器(需先setAccessible(true)) -
clazz.getConstructor().newInstance()—— 仅查找 public 构造器 -
clazz.newInstance()—— 已在 Java 9+ 标记为废弃,不推荐使用
例如:Person p = Person.class.getDeclaredConstructor().newInstance();
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
动态调用方法
分三步:获取 Method 对象 → 设置可访问性(若为 private)→ 执行 invoke:
-
getMethod("methodName", paramTypes...):只找 public 方法(含父类继承的) -
getDeclaredMethod("methodName", paramTypes...):可获取本类所有方法(包括 private),但不含继承的 - 调用前对 private 方法执行
method.setAccessible(true) -
method.invoke(obj, args...):第一个参数是目标对象(静态方法传 null),后续为实际参数
示例:调用私有方法 private String say(String msg):
Method m = clazz.getDeclaredMethod("say", String.class);<br>
m.setAccessible(true);<br>
String result = (String) m.invoke(p, "Hello");
注意事项与常见问题
反射虽灵活,但有明显代价和限制:
- 性能较低:JVM 无法内联、优化反射调用;频繁使用建议缓存
Constructor或Method实例 - 安全性检查开销:每次 invoke 都会做访问权限检查,
setAccessible(true)可跳过(需 SecurityManager 允许) - 编译期检查失效:方法名/参数错只能在运行时报
NoSuchMethodException或IllegalArgumentException - 泛型擦除:反射中获取的泛型信息有限,需配合
ParameterizedType等接口解析

















