Как я могу проверить класс, нет конструктора аргументов

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

Я не хочу проверять это, потому что он бросает исключение.

Есть ли другой способ?

Ответы

Ответ 1

Вы можете получить все 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);
}

Ответ 2

Если вы используете Spring, вы можете использовать ClassUtils.hasConstructor():

ClassUtils.hasConstructor(obj.getClass());

Ответ 3

Вы можете создать метод, который будет цитировать конструктор класса и проверить, нет ли конструктора no-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);