getConstructor Melempar NoSuchMethodException di Java
Saya sangat baru mengenal Java jadi ini mungkin pertanyaan bodoh, tetapi saya mencoba memahami cara membuat instance baru dari kelas dengan mendapatkan kelas dari instance yang sudah ada (saya pikir ini disebut refleksi).
Saat ini saya memiliki kelas super dan beberapa subkelasnya.
public abstract class SuperClazz {...}
public class SubClazz1 extends SuperClazz {...}
public class SubClazz2 extends SuperClazz {...}
Saya memiliki contoh yang ada dari salah satu subkelas ini (dideklarasikan hanya sebagai anggota kelas super, karena saya belum tahu subkelas mana yang akan dimilikinya). Saya mencoba untuk mendapatkan subclass mana pun dari instance yang ada ini dan membuat instance baru dari subclass yang sama.
Ini adalah pengaturan saya:
private SuperClazz oldSubInstance;
private SuperClazz newSubInstance;
newSubInstance = oldSubInstance.getClass().getConstructor(String.class, char.class, int.class).newInstance("abc", 'e', 6);
Yang memunculkan NoSuchMethodException.
Saya bingung karena saya tahu SuperClazz memiliki konstruktor yang mengambil tiga parameter, String, char dan int. Saya telah melihat jawaban di sini dan di sini, tetapi menemukan bahwa menerapkan perbaikan yang disarankan tidak berfungsi, atau bahwa masalah mereka tidak berlaku untuk situasi saya.
Apakah saya benar-benar salah paham tentang cara kerja getConstructor?
Jawaban
Anda perlu memastikan bahwa konstruktor all-args ada di kelas anak-anak.
Contoh berikut membuat 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);
keluaran ( toStringdiganti di tingkat kelas dasar):
SuperClazz(str=abc, chr=e, x=6)