Java Reflection getConstructor方法

时间:2012-11-22 08:42:54

标签: java inheritance reflection extends getconstructor

假设我有课程AB,其中B延伸A。我在B中也有一个构造函数,其中一个参数类型为A。我还有一个名为B的{​​{1}}类型的对象。

是否可以通过bObj扩展B.class.getConstructor(new Class[] { bObj.getClass() })来调用B并获取构造函数?目前我正在获得A

此致 斯坦

3 个答案:

答案 0 :(得分:7)

我建议您查看ConstructorUtils中的Apache Commons Lang 他们拥有构造函数发现方法的所有方式。

您的案件应由“Matching Accessible Constructors”覆盖。

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

 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
  } 
}

答案 1 :(得分:3)

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

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

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

第二个原因是Reflection API总是“次佳”。它可以做任何事情,但目标永远不会让它变得非常容易/友好使用(至少,这是我每次使用它时的想法: - )

答案 2 :(得分:0)

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

返回
Class.getConstructor()

Class.getDeclaredConstructor()

代替