为了账号安全,请及时绑定邮箱和手机立即绑定

当参数是构造函数的参数声明类型的子类时,反射找不到构造函数

当参数是构造函数的参数声明类型的子类时,反射找不到构造函数

鸿蒙传说 2021-09-03 17:31:27
我正在使用反射为特定需求实例化类。当前代码是这样的:public final <T> T instanciate(Class<? extends T> a_clazz, Object... args) {    // Other stuff when no arg...    Class<?>[] l_argsClasses = getClassesFromObjects(args);    Constructor<?> constructor = a_clazz.getConstructor(l_argsClasses);    constructor.newInstance(args)}不幸的是,我读到当给定参数在构造函数声明中的类型不完全相同时,它将不起作用。所以当我给一个子类时,没有找到构造函数,我得到一个 NoSuchMethodException。这里好像没有处理多态的机制。例子 :public class A {}public class B extends A {}public class Foo extends A {    public Foo(A a) {    }}将工作 :instanciate(Foo.class, new A());  // because Foo(A a)不会工作:instanciate(Foo.class, new B());  // because Foo(B b) does't exists你有什么解决方案来处理这个问题吗?谢谢
查看完整描述

2 回答

?
慕仙森

TA贡献1827条经验 获得超8个赞

所述java.beans封装具有类StatementExpression其可以执行与子类型规则的必要查找:

Expression e = new Expression(Foo.class, "new", new Object[]{ new B() });
Foo foo = (Foo)e.getValue();

execute方法的文档描述了"new"用于调用构造函数的特殊伪方法名称。


查看完整回答
反对 回复 2021-09-03
?
MMTTMM

TA贡献1869条经验 获得超4个赞

我选择使用的解决方案是 apache.commons.lang.reflect 提供的方法

它提供了两个不同的版本:

  • 需要完全匹配参数类型:invokeExactConstructor()

  • 一种通过赋值兼容性匹配参数类型:invokeConstructor()

我已经进行了简短的测试,并且可以正常工作。所以我正在使用它。

结果如下:

public final <T> T instanciate(Class<? extends T> clazz, Object... args) {

    try {

        return clazz.cast(ConstructorUtils.invokeConstructor(clazz, args));

    } catch (Exception e) {

        throw new RuntimeException("Failed to instanciate Object", e);

    }

}

非常简单的代码,很好


查看完整回答
反对 回复 2021-09-03
  • 2 回答
  • 0 关注
  • 191 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信