Как я могу проверить класс, нет конструктора аргументов
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);