我如何检查 class 没有参数构造函数
How can I check a class has no arguments constructor
Object obj = new Object();
try {
obj.getClass().getConstructor();
} catch (SecurityException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
dosomething();
e.printStackTrace();
}
我不想这样检查,因为它会引发异常。
还有其他方法吗?
您可以获取所有 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;
}
对于非 public 构造函数,您必须使用 getDeclaredConstructors()
。
改写为Stream
。
private boolean hasParameterlessConstructor(Class<?> clazz) {
return Stream.of(clazz.getConstructors())
.anyMatch((c) -> c.getParameterCount() == 0);
}
您可以创建一个方法来循环 class 的构造函数并检查是否有无参数构造函数。
boolean hasNoArgConstructor(Class<?> klass) {
for(Constructor c : klass.getDeclaredConstructors()) {
if(c.getParameterTypes().length == 0) return true;
}
return false;
}
请注意,通过使用getDeclaredConstructors()
,将包含编译器添加的默认构造函数。例如以下将 return true
class A { }
hasNoArgConstructor(A.class);
您可以使用 getConstructors()
,但它只会检查可见的构造函数。因此以下将 return 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);
如果您使用 Spring,您可以使用 ClassUtils.hasConstructor():
ClassUtils.hasConstructor(obj.getClass());
Object obj = new Object();
try {
obj.getClass().getConstructor();
} catch (SecurityException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
dosomething();
e.printStackTrace();
}
我不想这样检查,因为它会引发异常。
还有其他方法吗?
您可以获取所有 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;
}
对于非 public 构造函数,您必须使用 getDeclaredConstructors()
。
改写为Stream
。
private boolean hasParameterlessConstructor(Class<?> clazz) {
return Stream.of(clazz.getConstructors())
.anyMatch((c) -> c.getParameterCount() == 0);
}
您可以创建一个方法来循环 class 的构造函数并检查是否有无参数构造函数。
boolean hasNoArgConstructor(Class<?> klass) {
for(Constructor c : klass.getDeclaredConstructors()) {
if(c.getParameterTypes().length == 0) return true;
}
return false;
}
请注意,通过使用getDeclaredConstructors()
,将包含编译器添加的默认构造函数。例如以下将 return true
class A { }
hasNoArgConstructor(A.class);
您可以使用 getConstructors()
,但它只会检查可见的构造函数。因此以下将 return 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);
如果您使用 Spring,您可以使用 ClassUtils.hasConstructor():
ClassUtils.hasConstructor(obj.getClass());