java反射创建对象需先获取class对象,再通过constructor api调用构造器:无参用getdeclaredconstructor().newinstance(),带参或私有则需setaccessible(true)并传入对应参数,同时处理classnotfoundexception等异常。

Java 通过反射动态创建对象,核心是使用 Class 对象的 newInstance()(已弃用)或更推荐的 Constructor API。关键在于获取类的构造器并调用它,尤其当构造器带参、私有或需要绕过访问检查时。
获取 Class 对象
这是所有反射操作的前提。常用方式有三种:
-
Class.forName("全限定类名")—— 适用于运行时才知道类名(如配置文件、用户输入) -
MyClass.class—— 编译期已知类型,最安全高效 -
obj.getClass()—— 从已有实例反推类型
调用无参构造器
最简单场景:目标类有 public 无参构造方法。
Class> clazz = Class.forName("java.util.ArrayList");
Object obj = clazz.getDeclaredConstructor().newInstance(); // 推荐写法
// ✅ 安全、明确、兼容模块化(替代已废弃的 clazz.newInstance())
调用带参或私有构造器
当构造器需要参数,或被声明为 private 时,需显式获取并设置可访问性:
- 用
getDeclaredConstructor(Class...)指定参数类型(如String.class, int.class) - 对私有构造器调用
setAccessible(true)绕过 JVM 访问控制 - 再用
newInstance(Object...)传入实际参数值
示例:创建一个私有构造的类实例
Class> clazz = Class.forName("com.example.User");
Constructor> ctor = clazz.getDeclaredConstructor(String.class, int.class);
ctor.setAccessible(true);
Object user = ctor.newInstance("Alice", 25);
处理异常与注意事项
反射创建对象会抛出多个受检异常,必须处理:
-
ClassNotFoundException:类路径找不到该类 -
NoSuchMethodException:找不到匹配的构造器(注意参数类型要精确,int≠Integer) -
IllegalAccessException:构造器不可访问(未调用setAccessible(true)) -
InvocationTargetException:构造器内部抛出异常(查看.getCause()) -
InstantiationException:类是接口、抽象类或没有合适构造器
建议统一用 try-catch 包裹,或让方法 throws 这些异常;生产环境慎用私有构造器反射,可能破坏封装或被 JDK 版本限制(如 JDK 12+ 对反射访问的 stricter checking)。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











