Java反射支持运行时动态创建对象和调用方法,核心是Class对象及Constructor、Method等API;推荐用getConstructor/setAccessible+newInstance创建对象,getMethod/getDeclaredMethod+setAccessible+invoke调用方法,字段操作类似。

Java 反射机制可以在运行时动态创建对象、调用方法,无需编译期就确定类名或方法签名。核心是通过 Class 对象获取结构信息,再借助 Constructor、Method 等反射 API 操作。
动态创建对象的三种常用方式
必须先获得目标类的 Class 对象,例如:Class> clazz = Class.forName("com.example.User");
-
调用无参构造器(已过时,不推荐):
clazz.newInstance()—— JDK 9+ 已标记为废弃,且要求类有 public 无参构造器,还会触发类初始化 -
通过 Constructor 显式创建(推荐):先用
getConstructor(参数类型...)获取指定构造器,再调用newInstance(实参...)。支持 public 和 private 构造器(private 需先调setAccessible(true)) -
使用 getDeclaredConstructor + setAccessible:适用于私有构造器场景。例如:
Constructor> c = clazz.getDeclaredConstructor(String.class); c.setAccessible(true); Object obj = c.newInstance("张三");
动态调用方法的关键步骤
调用前需明确目标对象(或为 null 的静态方法),并确保方法可访问。
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
-
获取 Method 对象:
getMethod("methodName", 参数类型...)查找 public 方法(含父类);getDeclaredMethod("methodName", 参数类型...)查找本类所有方法(含 private) -
设置访问权限(如需):对 private 或 protected 方法,调用
method.setAccessible(true) -
执行 invoke:
method.invoke(obj, 实参...)。第一个参数是目标实例(静态方法传 null),返回值为 Object 类型,需按需强转
访问和修改字段(补充常见需求)
虽然问题聚焦在创建与调用,但实际常配合字段操作:
立即学习“Java免费学习笔记(深入)”;
- 用
getDeclaredField("fieldName")获取字段,调setAccessible(true)后可用field.get(obj)读值、field.set(obj, value)写值 - 注意:static 字段的第一个参数可传 null;final 字段修改需额外绕过修饰符检查(非常规操作,慎用)
反射能力强大,但也带来性能开销和安全风险。生产环境建议缓存 Class、Constructor、Method 等对象,避免重复查找;敏感操作应配合安全管理器或白名单控制。

















