Tôi đang làm việc trên lớp Trình tải cấu hình để tôi có thể thay đổi tham số của chương trình thông qua tệp văn bản bên ngoài (config.txt) thay vì phải biên dịch lại mã của tôi bằng mọi thay đổi mà tôi thực hiện.Cách thích hợp để sử dụng phản chiếu để khởi tạo các đối tượng của các lớp không xác định khi chạy là gì?
Đã được đề xuất rằng tôi sử dụng Phản chiếu của Java để thực hiện việc này, nhưng tôi hơi bối rối về cách tôi thực sự có thể triển khai điều này.
Tôi đã có thể trích xuất thành công tên lớp và các đối số cho hàm tạo của nó từ tệp văn bản của tôi, nhưng làm cách nào để chuyển từ đối tượng này sang đối tượng đã được khởi tạo?
đây là những gì tôi có các phương pháp của tôi cho đến nay:
public void loadObject(String classString, HashMap hm)
{
String className = props.getProperty(classString);
Class c = Class.forName(className);
}
classString là một chuỗi chứa tên của lớp, và hm là một hashmap nơi bản đồ thông số constructor lớp để các giá trị dự định của họ.
I.e., đối với class Foo (int xPos, float yPos)
, "xPos" sẽ ánh xạ tới một chuỗi các bản đồ int, và "yPos" dự định tới một chuỗi phao dự định. Tôi muốn để có thể quay lại, new Foo(hm.get"xPos".toInt, hm.get"yPost".toFloat)
, nhưng tôi không chắc chắn cách sử dụng động một hàm tạo như vậy (vấn đề là, có nhiều lớp có thể - có lẽ nó là bar
thay vì foo
chẳng hạn).
Tôi biết rằng có thể thực hiện if/else dựa trên classString và chỉ cần gọi hàm tạo thích hợp sau khi xác định theo cách đó, nhưng tôi đang tìm cách tạo mã mở rộng hơn mà không cần phải viết lại mỗi khi tôi thêm một lớp mới vào chương trình.
Tất cả các đối tượng có thể thừa kế từ một đối tượng chính.
Tôi e rằng tôi không hiểu dòng đầu tiên của mã giả của bạn.Tôi không quen với Reflection chút nào, vì vậy tôi không chắc mã của bạn thực sự là * đang làm gì *. Nó sẽ có thể mở rộng câu trả lời của bạn một chút? –
Ồ, được rồi, vì vậy, để làm theo ví dụ của tôi ở trên, Foo.GetConstructor sẽ trả về một mảng (int, float)? Và sau đó từ đó tôi có thể đúc đúng đối tượng vào initargs cho Constructor.newInstance? –
+1 để sử dụng giải pháp hiện có cho quản lý bean –