Object obj = new Object();
try {
obj.getClass().getConstructor();
} catch (SecurityException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
dosomething();
e.printStackTrace();
}
我不想像这样检查,因为它抛出异常。
还有另一种方式吗?
你可以得到所有 Constructor
s并检查它们的参数数量,当你找到一个有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);
}
如果您使用的是Spring,则可以使用 ClassUtils.hasConstructor():
ClassUtils.hasConstructor(obj.getClass());
您可以创建一个循环类的构造函数的方法,并检查是否有任何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);