【问题标题】:getConstructor Throws NoSuchMethodException in JavagetConstructor 在 Java 中抛出 NoSuchMethodException
【发布时间】:2020-10-15 21:04:08
【问题描述】:

我对 Java 很陌生,所以这可能是一个愚蠢的问题,但我试图了解如何通过从现有实例获取类来创建类的新实例(我认为这称为反射)。

目前我有一个超类和它的几个子类。

public abstract class SuperClazz {...}

public class SubClazz1 extends SuperClazz {...}

public class SubClazz2 extends SuperClazz {...}

我有这些子类之一的现有实例(仅声明为超类的成员,因为我还不知道它将属于哪个子类)。我正在尝试获取此现有实例所属的任何子类,并为同一子类创建一个新实例。

这是我的设置:

private SuperClazz oldSubInstance;
private SuperClazz newSubInstance;

newSubInstance = oldSubInstance.getClass().getConstructor(String.class, char.class, int.class).newInstance("abc", 'e', 6);

这会引发 NoSuchMethodException。

我很困惑,因为我知道 SuperClazz 有一个构造函数,它接受三个参数,一个 String、一个 char 和一个 int。我查看了herehere 的答案,但发现实施建议的修复不起作用,或者他们的问题不适用于我的情况。

我是否完全误解了 getConstructor 的工作原理?

【问题讨论】:

  • 你也可以添加堆栈跟踪吗?我的第一个猜测是构造函数无法正确访问。
  • 确保构造函数是公开的
  • getConstructor 仅搜索 public 构造函数。如果构造函数不公开,请使用getDeclaredConstructor

标签: java reflection constructor


【解决方案1】:

您需要确保子类中存在全参数构造函数。

以下示例创建一个newSubInstance

// using Lombok annotations for brevity
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@ToString
abstract class SuperClazz {
    private String str;
    private char chr;
    private int x;

    // getters/setters/default and all-args constructors provided by Lombok
}


class SubClazz1 extends SuperClazz {
    public SubClazz1(String str, char c, int i) { // providing constructor in the child class
        super(str, c, i);
    }
}

// test
SuperClazz oldSubInstance = new SubClazz1("def", 'g', 10);
SuperClazz newSubInstance;

newSubInstance = oldSubInstance.getClass()
                               .getConstructor(String.class, char.class, int.class)
                               .newInstance("abc", 'e', 6);

System.out.println(newSubInstance);

输出(toString 在基类级别被覆盖):

SuperClazz(str=abc, chr=e, x=6)

【讨论】:

    猜你喜欢
    • 2022-08-24
    • 1970-01-01
    • 1970-01-01
    • 2014-02-02
    • 1970-01-01
    • 2020-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多