Java如何判断类是否存在无参构造器?getConstructor返回true问题排查
Java判断类是否存在无参构造器问题解答
原代码问题分析
- 核心误区:你对
Class.getConstructor()方法的返回逻辑理解错误。该方法的行为是:如果找不到匹配参数列表的public构造方法,会直接抛出NoSuchMethodException,永远不会返回null。 - 你代码中的
if (classToCheck.getConstructor() != null)判断完全冗余:只要代码能执行到if判断行,就说明getConstructor()已经成功获取到无参构造器,必然不为null;如果不存在对应的构造器,代码会直接跳转到catch块,不会执行if判断。 - 额外注意:
getConstructor()只能获取public修饰的构造器,如果需要判断包含私有、保护、默认包访问权限的所有无参构造器,需要换成getDeclaredConstructor()方法。
修正后代码
仅判断public无参构造器版本
private boolean hasPublicNoArgConstructor(Class<?> classToCheck) { try { // 不抛异常即代表存在对应构造器 classToCheck.getConstructor(); return true; } catch (NoSuchMethodException e) { // 捕获到异常即代表不存在 return false; } }
判断所有访问权限无参构造器版本
private boolean hasAnyNoArgConstructor(Class<?> classToCheck) { try { classToCheck.getDeclaredConstructor(); return true; } catch (NoSuchMethodException e) { return false; } }
补充说明
如果入参可能是接口、抽象类、数组类、基本类型等特殊Class对象,可根据业务需求提前增加类型校验逻辑,避免不符合预期的结果。
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

