我有一个使用反射来加载几个类als模块的项目。这些模块可以具有带有特定参数的构造函数。如果该构造函数存在,我想使用该构造函数创建该类的新实例,如果它不存在,我想使用默认构造函数。
现在我想知道如何检查该特定构造函数是否存在。到目前为止我找到的唯一方法是这样做:
private boolean hasBotConstructor(final Class<?> moduleClass) {
try {
moduleClass.getDeclaredConstructor(Bot.class);
// Constructor exists
return true;
}
catch (NoSuchMethodException e) {
// Constructor doesn't exist
return false;
}
}
这样可行,但使用try / catch对我来说似乎是不好的做法。
答案 0 :(得分:0)
我认为,有更好的解决方案,但是我不确定默认构造函数的含义。如果您的构造函数带有1个参数,而默认构造函数没有参数,那么您可以像下面这样简单地进行操作:
return moduleClass.getDeclaredConstructors()[0].getParameterCount()==1;
这还假设您只声明了一个构造函数。
如果您有更多的构造函数,则不必检查整个数组(如果有的话)。
for(Constructor<?> constructor : moduleClass.getDeclaredConstructors()){
if(constructor.getParameterCount()==1 && constructor.getParameterTypes()[0] == Bot.class){
return true;
}
}
return false;
如果您需要检查构造函数中的特定类型并且这是我能够编写的最干净的解决方案,则此代码也可以处理。
解释:
getDeclaredConstructors返回特定类中的所有构造函数。比您检查每个构造函数(通过简单的foreach循环),如果它符合您的要求,则返回true。您可以通过更改参数数量并轻松地为不同的构造函数修改它,然后通过调用constructor.getParameterTypes()来检查每个参数的类型是否正确。