Java反射创建实例的核心是匹配构造特征:Class.newInstance()仅支持public无参构造且已废弃;Constructor.newInstance()支持带参和非public构造,需配合getDeclaredConstructor()与setAccessible(true);特殊类型(如内部类、数组)需遵循特定规则。

Java 中通过反射动态创建类的实例,核心是利用 Class 对象获取构造逻辑,再调用对应方法完成实例化。关键不在于“能不能”,而在于“用哪种方式匹配目标类的构造特征”。下面分三种常用、实用的方式说明:
用 Class.newInstance() 创建无参 public 实例
这是最简单的方式,但限制明确:仅适用于拥有 public 且无参数构造方法的类。
- 调用
Class.forName("全限定类名").newInstance()或直接MyClass.class.newInstance() - 底层会尝试调用该类的 public 默认构造器;若不存在,抛出
InstantiationException - 注意:JDK 9+ 已标记为废弃(
@Deprecated),不推荐用于新代码,尤其在模块化环境下可能受限
用 Constructor.newInstance() 创建带参或非 public 实例
更通用、更安全的方式,支持任意参数列表和访问权限控制。
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
- 先通过
getConstructor(Class...)获取 public 构造器,或getDeclaredConstructor(Class...)获取任意权限的构造器 - 对非 public 构造器,需调用
setAccessible(true)绕过访问检查(受 SecurityManager 约束) - 再调用
constructor.newInstance(参数值...)完成实例化,类型安全且异常明确(如IllegalAccessException、InvocationTargetException) - 例如:
String.class.getConstructor(char[].class).newInstance(new char[]{'h','e','l','l','o'})
特殊场景:创建内部类或数组实例
反射对结构特殊的类也提供支持,但需注意语义差异。
立即学习“Java免费学习笔记(深入)”;
-
静态内部类:可直接按普通类处理,用其完整类名(如
OuterClass.StaticInner.class)获取 Class 并实例化 -
非静态内部类:必须传入外部类实例作为第一个参数,例如:
constructor.newInstance(outerInstance, arg1, arg2) -
数组:不通过构造器,而是用
Array.newInstance(componentType, length),比如Array.newInstance(int.class, 5)创建 int[5]
反射创建实例的本质,是绕过编译期绑定,在运行时根据 Class 元数据触发 JVM 的对象分配与初始化流程。它灵活,但也带来性能开销和安全性考量——所以框架中通常只在必要处(如 Spring Bean 初始化、JSON 反序列化)谨慎使用。

















