getConstructor Ném NoSuchMethodException trong Java
Tôi là người mới làm quen với Java nên đây có thể là một câu hỏi ngớ ngẩn, nhưng tôi đang cố gắng hiểu cách tạo một thể hiện mới của một lớp bằng cách lấy lớp từ một cá thể hiện có (tôi nghĩ đây được gọi là phản chiếu).
Hiện tại tôi có một siêu lớp và một số lớp con của nó.
public abstract class SuperClazz {...}
public class SubClazz1 extends SuperClazz {...}
public class SubClazz2 extends SuperClazz {...}
Tôi có một phiên bản hiện tại của một trong các lớp con này (chỉ được khai báo là thành viên của lớp siêu cấp, vì tôi chưa biết nó sẽ thuộc về lớp con nào). Tôi đang cố gắng lấy bất kỳ lớp con nào mà cá thể hiện có này thuộc về và tạo một phiên bản mới của cùng lớp con đó.
Đây là thiết lập của tôi:
private SuperClazz oldSubInstance;
private SuperClazz newSubInstance;
newSubInstance = oldSubInstance.getClass().getConstructor(String.class, char.class, int.class).newInstance("abc", 'e', 6);
Mà ném NoSuchMethodException.
Tôi bối rối vì tôi biết SuperClazz có một hàm tạo có ba tham số, một chuỗi, một ký tự và một số nguyên. Tôi đã xem các câu trả lời ở đây và ở đây nhưng nhận thấy rằng việc triển khai các bản sửa lỗi được đề xuất không hoạt động hoặc các vấn đề của chúng không áp dụng cho trường hợp của tôi.
Tôi hoàn toàn hiểu sai về cách hoạt động của getConstructor?
Trả lời
Bạn cần đảm bảo rằng hàm tạo all-args tồn tại trong (các) lớp con.
Ví dụ sau tạo ra 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);
đầu ra (được toStringghi đè ở cấp lớp cơ sở):
SuperClazz(str=abc, chr=e, x=6)