Java Reflection getConstructor方法
假设我有A
和B
类,其中B
延伸A
我在B
也有一个构造函数,其中一个参数是A
类型。 我还有一个名为bObj
B
型对象。
有没有办法调用B.class.getConstructor(new Class[] { bObj.getClass() })
并获得构造函数,因为B
扩展了A
? 目前我正在获得NoSuchMethodException
。
此致,斯坦
我建议你看一下Apache Commons Lang的ConstructorUtils
。
他们拥有构造函数发现方法的所有方式。
您的案例应由“ 匹配可访问的构造函数 ”涵盖。
以下是上下文中使用的方法的示例。 基本上,你这样称呼它:
private 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 } }
不,搜索您的方法需要精确的参数。 因此,当您使用reflectionAPI的查找/搜索方法查找构造函数,方法或字段时,API使用equals()
来查找匹配项。
如果您需要与Java编译器使用的逻辑相同的逻辑,则需要使用类似FEST Reflect或commons beanutils的框架。 或者您必须调用getConstructors()
并编写自己的filter代码。
乍一看,这似乎很愚蠢:如果Java编译器可以做到,为什么不能使用Reflection API? 有两个原因:首先,Java运行时不需要搜索要调用的方法,因为编译器已经选择了正确的方法。
第二个原因是Reflection API总是“次佳”。 它可以做任何事情,但目标永远不会让它真的很容易/友好使用(至少,这就是我每次使用它时的想法:-)
如果您的构造函数不是公共的(或者它的类不是公共的),或者无法从您的代码范围访问,则不会通过
Class.getConstructor()
尝试
Class.getDeclaredConstructor()
代替