8

可以说我有课程A,并且B在哪里B扩展A。我也有一个B带有一个参数类型的构造函数A。我还有一个B名为bObj.

有没有办法调用B.class.getConstructor(new Class[] { bObj.getClass() })并获取构造函数,因为Bextends A?目前我得到一个NoSuchMethodException.

4

3 回答 3

9

我建议你看看ConstructorUtils来自Apache Commons Lang的文章。
他们有各种各样的构造函数发现方法。

您的案例应包含在“匹配可访问构造函数”中。

是上下文中使用的方法的示例。基本上,你这样称呼它:

 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
  } 
}
于 2012-11-22T08:53:19.023 回答
4

不,搜索您的方法需要精确的参数。因此,当您使用反射 API 的查找/搜索方法查找构造函数、方法或字段时,该 API 用于equals()查找匹配项。

如果您需要 Java 编译器将使用的相同逻辑,则需要使用FEST Reflectcommons beanutils 之类的框架。或者您必须调用getConstructors()并编写自己的过滤器代码。

乍一看,这似乎很愚蠢:如果 Java 编译器可以做到,为什么反射 API 不能呢?有两个原因:首先,Java 运行时不需要搜索调用哪个方法,因为编译器已经选择了正确的方法。

第二个原因是反射 API 总是“次佳”。它可以做任何事情,但目标永远不是让它真正易于/友好地使用(至少,这是我每次使用它时的想法:-)

于 2012-11-22T08:51:58.433 回答
0

如果您的构造函数不是公共的(或者如果它的类不是公共的),或者无法从您的代码范围访问,则不会通过

Class.getConstructor()

尝试

Class.getDeclaredConstructor()

反而

于 2016-12-13T12:13:26.390 回答