我对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有一个构造函数,它接受三个参数,一个字符串,一个字符和一个整型。我查看了答案here和here,但发现实施建议的修复程序不起作用,或者他们的问题不适用于我的情况。
我是不是完全误解了getConstructor的工作原理?
发布于 2020-10-15 21:04:08
您需要确保在子类中存在all-args构造函数。
以下示例创建一个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)https://stackoverflow.com/questions/64371880
复制相似问题