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