Java反射创建对象需先获取Class对象,方式有类名.class、对象.getClass()、Class.forName();再通过Constructor的newInstance()实例化,注意异常处理与性能优化。

Java 反射机制在运行时动态创建对象实例,核心是先获取目标类的 Class 对象,再通过其构造器(Constructor)调用 newInstance() 方法完成实例化。整个过程不依赖编译期类型信息,适用于插件加载、框架注入、配置驱动等场景。
获取 Class 对象的三种可靠方式
这是所有反射操作的前提,不同方式适用不同上下文:
- 类名.class:编译期已知类,最轻量,不触发类初始化(静态块不执行)
- 对象.getClass():已有实例时使用,会触发该对象所属类的初始化(包括静态块和构造器)
- Class.forName("全限定类名"):运行时按字符串加载类,最常用;会执行静态初始化块,适合配置化场景(如读取配置文件中的类名)
用无参构造器创建实例
若目标类有 public 无参构造器,推荐写法如下(JDK 9+ 不再支持过时的 clazz.newInstance()):
Class<User> clazz = User.class; User user = clazz.getConstructor().newInstance();
注意:getConstructor() 只查找 public 构造器;若需访问私有无参构造器,改用 getDeclaredConstructor() 并调用 setAccessible(true)。
立即学习“Java免费学习笔记(深入)”;
用带参构造器创建实例
当构造器含参数时,必须显式指定参数类型,并传入对应实参:
- 用
getDeclaredConstructor(String.class, int.class)获取构造器(支持 private) - 调用
setAccessible(true)绕过访问控制 - 再用
newInstance("张三", 25)创建实例
示例:
Constructor<User> ctor = User.class.getDeclaredConstructor(String.class, int.class);
ctor.setAccessible(true);
User user = ctor.newInstance("张三", 25);
异常处理与关键注意事项
反射调用易抛出多种异常,需针对性捕获:
- ClassNotFoundException:类名拼写错误、类不在 classpath 中
- NoSuchMethodException:构造器签名不匹配(如参数类型顺序/数量不对)
-
IllegalAccessException:未调用
setAccessible(true)就访问 private 成员 -
InvocationTargetException:构造器内部抛出异常(可调用
e.getCause()查看原始错误)
另外,反射创建对象比直接 new 慢,且破坏封装性,仅在必要时使用;生产环境建议配合缓存 Constructor 实例来减少重复查找开销。


















