假设我有类A
和B
,其中B
扩展A
。我还有一个构造函数B
带有一个类型 A
的参数。我还有一个类型为 B
的对象,称为 bObj
。
有没有办法调用B.class.getConstructor(new Class[] { bObj.getClass() })
并获取构造函数,因为B
扩展了A
?目前我正在得到一个NoSuchMethodException
.
我建议你看看Apache Commons Lang.
的ConstructorUtils
它们具有各种构造函数发现方法。
您的案例应由"匹配的可访问构造函数"涵盖。
下面是上下文中使用的方法的示例。基本上,你这样称呼它:
private <T> T instantiate(Class<?> input, Object parameter) {
try {
Constructor<?> constructor = ConstructorUtils.getMatchingAccessibleConstructor(input, parameter.getClass());
return (T) constructor.newInstance(parameter);
} catch (Exception e) {
//handle various exceptions
}
}
不,搜索您的方法需要确切的参数。因此,当您使用反射 API 的查找/搜索方法查找构造函数、方法或字段时,API 会使用 equals()
来查找匹配项。
如果你需要与Java编译器相同的逻辑,你将需要使用像FEST Reflect或commons beanutils这样的框架。或者,必须调用getConstructors()
并编写自己的筛选器代码。
乍一看,这似乎很愚蠢:如果Java编译器可以做到这一点,为什么Reflection API不能呢?有两个原因:首先,Java 运行时不需要搜索要调用的方法,因为编译器已经选择了正确的方法。
第二个原因是Reflection API始终是"第二好的"。它可以做任何事情,但目标从来都不是让它真正容易/友好地使用(至少,这是我每次使用它时的想法:-)
如果您的构造函数不是公共的(或者它的类不是公共的),或者无法从代码范围访问,则不会通过
Class.getConstructor()
尝试
Class.getDeclaredConstructor()
相反