Là một phần của việc phát triển một ScriptEngine nhỏ, tôi gọi một cách phản ánh các phương thức java. Một cuộc gọi của công cụ script cho tôi đối tượng tên phương thức và một mảng các đối số. Để gọi phương thức, tôi đã cố gắng giải quyết nó bằng một cuộc gọi tới Class.getMethod (tên, kiểu đối số).
Tuy nhiên, điều này chỉ hoạt động khi các lớp của đối số và các lớp được mong đợi theo Phương thức giống nhau.Gọi phương thức lắp gần nhất
Object o1 = new Object();
Object out = System.out;
//Works as System.out.println(Object) is defined
Method ms = out.getClass().getMethod("println",o1.getClass());
Object o2 = new Integer(4);
//Does not work as System.out.println(Integer) is not defined
Method mo = out.getClass().getMethod("println",o2.getClass());
Tôi muốn biết nếu có cách "đơn giản" để có phương pháp phù hợp, nếu có thể phù hợp nhất với các loại đối số hoặc nếu tôi phải thực hiện điều này.
phù hợp gần nhất sẽ là:
Object o1 = new Integer(1);
Object o2 = new String("");
getMethod(name, o1.getClass())//println(Object)
getMethod(name, o2.getClass())//println(String)
Cập nhật:
Để làm rõ những gì tôi cần: The Script Engine là một dự án nhỏ tôi viết trong thời gian rảnh rỗi vì vậy không có quy tắc strikt Tôi có để làm theo. Vì vậy, tôi nghĩ rằng việc chọn các phương thức được gọi từ Engine giống như cách trình biên dịch java chọn các phương thức tại thời gian biên dịch chỉ với kiểu động và không phải kiểu tĩnh của Object sẽ hoạt động (có hoặc không có autoboxing)
Đây là những gì tôi đầu tiên hy vọng rằng Class.getMethod() sẽ giải quyết. Nhưng Class.getMethod() đòi hỏi các lớp giống như các kiểu đối số chính xác như phương thức khai báo, sử dụng một lớp con sẽ dẫn đến một ngoại lệ không có phương thức như vậy. Điều này có thể xảy ra vì lý do tốt, nhưng làm cho phương pháp vô dụng đối với tôi, vì tôi không biết trước các loại đối số nào sẽ phù hợp.
Một thay thế sẽ là gọi Class.getMethods() và lặp qua mảng được trả về và cố gắng tìm phương thức phù hợp. Tuy nhiên, điều này sẽ phức tạp nếu tôi không muốn sử dụng phương pháp "tốt" đầu tiên mà tôi gặp phải, vì vậy tôi hy vọng rằng sẽ có một giải pháp hiện có ít nhất là xử lý:
- gần nhất: Nếu arg.getClass() == lớp con và phương pháp m (lớp cha), m (subclass) sau đó gọi m (subclass)
- tranh cãi biến: System.out.printf (string, string ...)
Hỗ trợ tự động hóa cũng sẽ thú vị.
Nếu một cuộc gọi không thể giải quyết, nó có thể ném một ngoại lệ (ma (String, Object), ma (Object, String), args = String, String)
(Nếu bạn thực hiện nó đến đây, cảm ơn bạn đã dành thời gian để đọc nó :-))
đầu tiên xác định quy tắc nghiêm ngặt cho "gần gũi", sau đó thực hiện một cách chi tiết. – Bozho
chỉ là những gì tôi đã tự hỏi, quá. Nhưng đối với tất cả những người trả lời chính xác về mặt ngữ nghĩa, "Xác định gần nhất", tôi có một cách dễ dàng: cái mà Java bình thường sẽ chọn (tôi đoán là khi tải lớp). –