Java Reflection getConstructor method



假设我有类AB,其中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()

相反

相关内容

最新更新