Object obj = new Object();
try {
obj.getClass().getConstructor();
} catch (SecurityException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
dosomething();
e.printStackTrace();
}
我不希望像这样检查,因为它会抛出异常。
还有其他办法吗?
答案 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);