Java反射实例化对象需先获取Class对象(三种方式),再选对构造器API,设setAccessible(true)绕权限,最后处理异常和参数类型匹配。

Java 反射获取构造方法并实例化对象,核心是先拿到 Class 对象,再用对应 API 找到构造器,设为可访问后调用 newInstance()。关键不在“能不能”,而在“怎么选对方法、绕过权限、处理异常”。
一、先拿到 Class 对象
这是所有反射操作的起点,三种方式按场景选:
-
已有实例时:直接调
obj.getClass(),安全且无需异常处理 -
编译期已知类型时:用
User.class,零开销、类型安全,适合工具类或泛型代码 -
运行时动态加载(如配置驱动、插件):用
Class.forName("com.example.User"),必须捕获ClassNotFoundException
二、选对构造器获取方法
公有和私有构造器不能混用同一套 API:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
只想要 public 构造器(含父类继承的):用
getConstructors()或getConstructor(Class...) -
要包括 private、protected、包级构造器:必须用
getDeclaredConstructors()或getDeclaredConstructor(Class...) -
参数类型必须严格匹配:
int.class≠Integer.class;String.class不能写成string.class(大小写敏感)
三、实例化前必须 setAccessible(true)
哪怕只是 private 无参构造器,不设可访问就会抛 IllegalAccessException:
立即学习“Java免费学习笔记(深入)”;
Constructor> ctor = clazz.getDeclaredConstructor();ctor.setAccessible(true); // 这行不能省,也不能放在 newInstance() 之后Object obj = ctor.newInstance(); // Java 9+ 不推荐 clazz.newInstance()
四、注意异常处理和参数传递
反射调用不是普通方法调用,异常包装和参数类型容易出错:
- 构造器若抛出受检异常(如
IOException),会被包装成InvocationTargetException,真实异常在e.getCause()里 - 传参必须与构造器签名完全一致:比如
new User(String, int),就得传String.class, int.class,不能传Integer.class - 如果构造器本身抛运行时异常(如
NullPointerException),会原样抛出,不被包装

















