java中获取构造方法需区分public(getconstructors)与全部(getdeclaredconstructors),前者仅返回本类public构造器,后者含private/protected但需setaccessible(true);精确匹配用getconstructor(class...),创建实例时须处理instantiationexception、illegalaccessexception等异常。

Java 中可以通过 Class 对象的 getConstructors() 或 getDeclaredConstructors() 方法获取构造方法,再用 Constructor.newInstance() 创建实例。关键在于区分“公共构造方法”和“全部构造方法”,以及处理访问权限和参数匹配问题。
获取所有公共构造方法(含父类)
getConstructors() 只返回当前类中 public 修饰的构造方法,且会继承父类的 public 构造方法(但实际仅返回本类声明的 public 构造器,不包含父类的;JDK 文档明确说明它只返回本类的 public 构造器)。适用于安全、开放场景,无需设为可访问。
- 调用方式:
clazz.getConstructors() - 返回数组长度为 0 表示该类没有 public 构造方法(如工具类或单例类)
- 创建实例时直接调用
constructor.newInstance(args...),无需额外设置访问权限
获取本类所有构造方法(含 private / protected)
getDeclaredConstructors() 返回本类声明的所有构造方法,无论访问修饰符,但不包括父类的任何构造方法。若需调用 private 构造器(如反序列化、测试单例),必须先调用 setAccessible(true)。
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
- 调用方式:
clazz.getDeclaredConstructors() - 对 private 构造器,必须加
constructor.setAccessible(true)才能 newInstance - 注意:模块系统(Java 9+)下,若类在不同模块且未导出包,
setAccessible(true)可能抛InaccessibleObjectException
按参数类型精确获取某个构造方法
当存在重载构造器时,推荐用 getConstructor(Class...) 或 getDeclaredConstructor(Class...) 精确匹配参数类型,避免遍历判断。
-
clazz.getConstructor(String.class, int.class)—— 查找 public 构造器 -
clazz.getDeclaredConstructor(int.class)—— 查找任意修饰符的单参 int 构造器 - 参数类型必须严格匹配(如传
Integer.class找不到int参数的构造器) - 找不到会抛
NoSuchMethodException,需捕获处理
创建实例的注意事项
反射创建对象本质是绕过编译期检查,运行时可能触发多种异常,需统一处理:
-
InstantiationException:类是抽象类或接口,或没有合适构造器 -
IllegalAccessException:构造器不可访问且未调用setAccessible(true) -
IllegalArgumentException:参数类型/数量不匹配 -
InvocationTargetException:构造器内部抛出异常(包装为该异常,可用e.getCause()获取原始异常) - 建议用 try-catch 包裹
newInstance(),并根据业务需要做日志或 fallback
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










