java - getConstructor 在 Java 中抛出 NoSuchMethodException
问题描述
我对 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。我在这里和这里查看了答案,但发现实施建议的修复不起作用,或者他们的问题不适用于我的情况。
我完全误解了 getConstructor 的工作原理吗?
解决方案
您需要确保子类中存在全参数构造函数。
以下示例创建一个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)
推荐阅读
- assembly - NASM 赋值
- c# - Microsoft Graph API 不准确的错误消息
- python - 基本 Python - 通过 input() 将硬编码的 int 变量与动态 int 变量进行比较时,无法使 IF 语句工作
- save - RuntimeError:用于酸洗的未知 IValue 类型:设备
- python - 泛型工厂
- javascript - Element.scrollHeight 和 Element.scrollTop 每次被调用时都会计算返回值吗?
- c - Visual Studio 2019:强制包含文件不起作用?
- python - “解包”熊猫数据框的最快方法
- reactjs - React-Formik:如何使用 Formik 创建注册表单?
- python - 如何在谷歌浏览器中打开网站