Java反射创建对象的前提是类已加载进JVM并生成Class对象,流程为:加载类→获取Class对象→通过构造器实例化;不可在加载过程中创建对象。

Java 反射机制本身不参与类加载过程,而是在类**已加载进 JVM 并生成 Class 对象后**,才开始工作。获取对象(即创建实例)是反射的典型用途之一,前提是目标类已被加载——这通常由类加载器自动完成,或通过 Class.forName()、ClassLoader.loadClass() 等方式显式触发。
确认类已加载是前提
反射创建对象前,必须确保该类字节码已进入方法区(元空间),且对应 Class 对象存在。常见加载方式及特点:
- Class.forName("com.example.User"):加载 + 初始化(执行静态块),适合需要立即准备类的场景
- ClassLoader.loadClass("com.example.User"):仅加载,不初始化,适用于延迟初始化需求
- User.class 或 new User().getClass():类已在编译期或运行时被加载,直接可用
用反射创建对象的常用方式
拿到 Class 对象后,可通过其构造器创建实例。关键点在于构造器可见性与参数匹配:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 调用公有无参构造器:
clazz.getDeclaredConstructor().newInstance() - 调用公有带参构造器:
clazz.getConstructor(String.class, int.class).newInstance("张三", 25) - 调用私有构造器(如单例反序列化):
Constructor<?> ctor = clazz.getDeclaredConstructor();<br> ctor.setAccessible(true);<br> Object obj = ctor.newInstance();
注意访问控制与异常处理
反射创建对象时容易遇到两类典型问题:
立即学习“Java免费学习笔记(深入)”;
- 私有构造器默认不可访问,必须调用
setAccessible(true)否则抛IllegalAccessException - 构造器不存在、参数不匹配、类未加载等会分别抛出
NoSuchMethodException、InstantiationException、ClassNotFoundException等,需统一捕获ReflectiveOperationException - 若类含非 public 无参构造器,
getConstructor()找不到,必须用getDeclaredConstructor()
实际调用链很清晰
整个流程就是三步:加载类 → 获取 Class 对象 → 拿构造器并实例化。没有“在加载过程中”创建对象这回事,所有 newInstance() 调用都发生在类加载完成之后。只要 Class 对象能拿到,对象就能造出来,和是否写死在代码里无关。

















