我怎样才能检查一个类没有参数构造函数

时间:2015-01-07 02:38:00

标签: java reflection

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

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

还有其他办法吗?

3 个答案:

答案 0 :(得分:12)

您可以获取所有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;
}

您必须将getDeclaredConstructors()用于非公共构造函数。

Stream重写。

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

答案 1 :(得分:4)

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

ClassUtils.hasConstructor(obj.getClass());

答案 2 :(得分:1)

您可以创建一个循环类的构造函数的方法,并检查是否有任何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);