问题 如何检查类没有参数构造函数


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

我不想像这样检查,因为它抛出异常。

还有另一种方式吗?


8635
2018-01-07 02:37


起源

为什么异常恐惧症? - user207421


答案:


你可以得到所有 Constructors并检查它们的参数数量,当你找到一个有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;
}

你必须使用 getDeclaredConstructors() 对于非公共建设者。

改写 Stream

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

12
2018-01-07 02:45



构造函数类没有getParameterCount()方法: docs.oracle.com/javase/7/docs/api/java/lang/reflect/... - gerrytan
@gerrytan 这是一种新的Java 8方法。您可以使用 getParameterTypes 并检查返回的数组的大小。 - Sotirios Delimanolis


如果您使用的是Spring,则可以使用 ClassUtils.hasConstructor()

ClassUtils.hasConstructor(obj.getClass());

3
2018-01-07 03:00





您可以创建一个循环类的构造函数的方法,并检查是否有任何arg构造函数。

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

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

class A { }

hasNoArgConstructor(A.class);

您可以使用 getConstructors() 但它只会检查可见的构造函数。因此,以下将返回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);

1
2018-01-07 02:56