Java反射实例化对象需先获取Class对象(类名.class、对象.getClass()、Class.forName),再用getDeclaredConstructor().newInstance()调用构造器;支持无参/带参/私有构造器,需注意参数匹配、setAccessible(true)及异常处理。

Java 中通过反射机制实例化一个类的对象,核心是获取 Class 对象,再调用其 newInstance()(已弃用)或更推荐的 getDeclaredConstructor().newInstance() 方法。
获取 Class 对象
有三种常用方式:
-
类名.class:适用于编译期已知类,如
String.class -
对象.getClass():适用于已有实例,如
"hello".getClass() -
Class.forName("全限定类名"):适用于运行时动态加载,如
Class.forName("java.util.ArrayList");注意会触发类初始化
调用无参构造器创建实例
最常见场景是实例化一个有 public 无参构造器的类:
Class<?> clazz = Class.forName("com.example.User");
Object instance = clazz.getDeclaredConstructor().newInstance();
相比已废弃的 clazz.newInstance(),getDeclaredConstructor().newInstance() 更安全、更明确,且能绕过访问控制(需配合 setAccessible(true) 处理私有构造器)。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
调用带参构造器创建实例
若目标类只有含参构造器,需指定参数类型并传入对应实参:
Class<?> clazz = Class.forName("com.example.Person");
// 假设 Person(String name, int age) 构造器
Constructor<?> ctor = clazz.getDeclaredConstructor(String.class, int.class);
Object instance = ctor.newInstance("Alice", 25);
注意参数类型必须严格匹配(基本类型用包装类或对应 primitive 类型,如 int.class),否则抛 NoSuchMethodException。
处理访问权限与异常
私有构造器需手动解除访问检查;同时反射操作可能抛出多种异常,应合理捕获:
- 使用
setAccessible(true)允许访问 private 构造器 - 统一捕获
ClassNotFoundException、NoSuchMethodException、IllegalAccessException、InstantiationException、InvocationTargetException -
InvocationTargetException表示构造器内部抛出异常,可通过e.getCause()获取原始异常

















