Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
getConstructor在Java中抛出NoSuchMethodException_Java_Reflection_Constructor - Fatal编程技术网

getConstructor在Java中抛出NoSuchMethodException

getConstructor在Java中抛出NoSuchMethodException,java,reflection,constructor,Java,Reflection,Constructor,我对Java非常陌生,所以这可能是一个愚蠢的问题,但我试图理解如何通过从现有实例获取类来创建类的新实例(我认为这称为反射) 目前我有一个超类和它的几个子类 public abstract class SuperClazz {...} public class SubClazz1 extends SuperClazz {...} public class SubClazz2 extends SuperClazz {...} 我有这些子类之一的现有实例(仅声明为超级类的成员,因为我还不知道它将

我对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);
这不会引发任何异常

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


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

您需要确保所有参数构造函数都存在于子类中

以下示例创建了一个
新闻ubinstance

//为了简洁起见,使用Lombok注释
@吸气剂
@塞特
@AllArgsConstructor
@诺尔格构装师
@托斯特林
抽象类超混沌{
私有字符串str;
私有字符chr;
私人INTX;
//Lombok提供的getter/setters/default和所有args构造函数
}
类子类1扩展了SuperClazz{
公共子类1(String str、char c、int i){//在子类中提供构造函数
超级(str,c,i);
}
}
//试验
SuperClazz oldSubInstance=新的子类1(“def”,g',10);
超级杯新闻持久性;
newSubInstance=oldSubInstance.getClass()
.getConstructor(String.class、char.class、int.class)
.newInstance(“abc”,e',6);
System.out.println(newSubInstance);
输出(
toString
在基类级别重写):


您也可以添加堆栈跟踪吗?我的第一个猜测是构造函数无法正确访问。请确保构造函数是公共的
getConstructor
仅搜索
public
构造函数。如果构造函数不是公共的,请使用
getDeclaredConstructor
SuperClazz(str=abc, chr=e, x=6)