我如何检查 class 没有参数构造函数

How can I check a class has no arguments constructor

    Object obj = new Object();
    try {
        obj.getClass().getConstructor();
    } catch (SecurityException e) {
        e.printStackTrace();
    } catch (NoSuchMethodException e) {
        dosomething();          
        e.printStackTrace();
    }

我不想这样检查,因为它会引发异常。

还有其他方法吗?

您可以获取所有 Constructor 并检查它们的参数数量,当您找到一个参数为 0 时停止。

private boolean hasParameterlessPublicConstructor(Class<?> clazz) {
    for (Constructor<?> constructor : clazz.getConstructors()) {
        // In Java 7-, use getParameterTypes and check the length of the array returned
        if (constructor.getParameterCount() == 0) { 
            return true;
        }
    }
    return false;
}

对于非 public 构造函数,您必须使用 getDeclaredConstructors()

改写为Stream

private boolean hasParameterlessConstructor(Class<?> clazz) {
    return Stream.of(clazz.getConstructors())
                 .anyMatch((c) -> c.getParameterCount() == 0);
}

您可以创建一个方法来循环 class 的构造函数并检查是否有无参数构造函数。

boolean hasNoArgConstructor(Class<?> klass) {
  for(Constructor c : klass.getDeclaredConstructors()) {
    if(c.getParameterTypes().length == 0) return true;
  }
  return false;
}

请注意,通过使用getDeclaredConstructors(),将包含编译器添加的默认构造函数。例如以下将 return true

class A { }

hasNoArgConstructor(A.class);

您可以使用 getConstructors(),但它只会检查可见的构造函数。因此以下将 return false

boolean hasNoArgConstructor(Class<?> klass) {
  for(Constructor c : klass.getConstructors()) {
    if(c.getParameterTypes().length == 0) return true;
  }
  return false;
}

class B {
  private B() {}
}

hasNoArgConstructor(B.class);

如果您使用 Spring,您可以使用 ClassUtils.hasConstructor():

ClassUtils.hasConstructor(obj.getClass());