Đây là cách để tạo ra một thể hiện bằng cách sử dụng tên lớp. Kiểu cụ thể của Alert
phải có một hàm tạo công khai không có đối số.
private Alert alert;
public void setAlert(String className)
{
try {
Class<?> raw = Class.forName(className);
Class<? extends Alert> type = raw.asSubclass(Alert.class);
Constructor<? extends Alert> ctor = type.getConstructor();
this.alert = ctor.newInstance();
} catch (Exception ex) {
throw new IllegalArgumentException("Invalid Alert implementation.", ex);
}
}
Người gọi sẽ sử dụng nó như thế này:
AlertController aController = new AlertController();
controller.setAlert("com.y.foo.RedAlert");
Nếu bạn tạo một quy ước để thông qua một tập hợp các tham số cho các nhà xây dựng, bạn có thể làm điều đó quá, nhưng bạn sẽ cần phải làm thêm một chút trong cuộc gọi getConstructor()
để tìm. Bạn cũng có thể sử dụng các hàm tạo không công khai, nhưng, một lần nữa, phải mất một chút công việc phụ.
Các đề xuất để chuyển lớp học theo nghĩa đen, RedAlert.class
, không có ý nghĩa nhiều. Nếu lớp RedAlert
có sẵn cho người gọi tại thời gian biên dịch, bạn chỉ cần sử dụng hàm tạo của nó, new RedAlert()
.
Bạn cần xem xét API phản chiếu Java, [Class] (http://docs.oracle.com/javase/7/docs/api/java/lang/Class.html)! – NINCOMPOOP
Nhưng tại sao bạn lại muốn nó? Có gì sai với 'SetAlert (new RedAlert())'? –