2011-02-04 58 views
7

Tôi có một phương thức tĩnh có tên là selectDialog (String s, int i), trong đó tôi muốn gọi một phương thức khác trong cùng một lớp (Dialogs.class) dựa trên các tham số được cung cấp cho selectDialog. s là tên của phương thức mong muốn và tôi là tham số đơn.Android/Java: Gọi phương thức sử dụng phản chiếu?

Tôi đã thử nhiều hướng dẫn và đã dành một vài giờ đọc về chủ đề này nhưng tôi dường như không thể nắm bắt được chính xác những gì tôi cần làm.

Bất kỳ ý tưởng nào?

Cảm ơn!

+0

Bạn có thực sự cần phản ánh không? – dacwe

+1

Mặc dù có thể có một giải pháp tốt cho bạn, nhưng có thể tốt hơn là nên đăng sự cố thực sự mà bạn đang cố giải quyết. Ví dụ. tại sao bạn muốn thực hiện lựa chọn phương pháp này? Rất thường ai đó có thể tìm thấy một mẫu thiết kế OOP giải quyết vấn đề cơ bản thay vì tìm một giải pháp par-force cho câu hỏi cụ thể. Ví dụ, mẫu nhà máy có thể là những gì bạn cần, cho phép bạn chọn các lớp, sau đó cung cấp chức năng được yêu cầu như các triển khai của một thông điệp trừu tượng. Đừng để các chi tiết của vấn đề của bạn cho phép bạn để mất cảnh của bức tranh lớn hơn. – Ber

+0

Mỗi phương thức trong lớp này (khác với selectDialog) đại diện cho một loạt các hành động duy nhất, (10+ mỗi) và lớp đặc biệt này bao gồm hơn 300 phương pháp để lựa chọn. Điều này dường như là con đường tốt nhất để tôi đi. Tôi có sai không? Có lựa chọn nào tốt hơn không? – Jared

Trả lời

13

Tại sao bạn muốn gọi phương thức có tên được chuyển trong tham số Chuỗi? Bạn không thể tạo hằng số cho các hành động khác nhau, sau đó sử dụng switch và trong mỗi trường hợp, hãy gọi phương thức có tham số i?

Bạn sẽ có lợi ích của trình biên dịch kiểm tra mã của bạn do lỗi.

chỉnh sửa: nếu bạn thực sự muốn sử dụng phản chiếu, lấy một đối tượng Method với:

Method m = YourClass.class.getMethod("method_name",new Class[] { Integer.class }) 

Tôi đoán Integer.class có thể làm việc. Sau đó gọi metod như

m.invoke(null,123); //first argument is the object to invoke on, ignored if static method 
+0

Mỗi phương thức trong lớp này (khác với selectDialog) đại diện cho một loạt các hành động duy nhất, (10+ mỗi) và lớp đặc biệt này bao gồm hơn 300 phương pháp để lựa chọn. Điều này dường như là con đường tốt nhất cho tôi đi. Tôi có sai không? Có lựa chọn nào tốt hơn không? – Jared

+1

Nếu bạn đang đối phó với số lượng lớn các phương pháp này, nó có thể là tốt nhất. Nhưng bản thân tôi sẽ sợ lỗi chính tả. – Axarydax

+0

Bạn không cần bọc các tham số lớp trong một mảng; bạn có thể chỉ cần cung cấp cho họ như một danh sách các đối số. Ví dụ: 'YourClass.class.getMethod (" method_name ", Integer.class, String.class)'. –

2
Method method = Dialogs.getMethod(s, Integer.class); 
method.invoke(null, i); 
1

Nếu bạn chỉ muốn gọi một phương pháp tĩnh trên lớp, sau đó bạn có thể sử dụng phương pháp đã được xác định bởi những người khác:

Method method = Dialogs.getMethod(s, Integer.class); 
method.invoke(null, i); 

Nhưng nếu bạn muốn để có thể sử dụng một phương thức tĩnh để gọi một phương thức không tĩnh, sau đó bạn sẽ cần phải truyền vào đối tượng mà bạn muốn tham chiếu hoặc làm cho selectDialog không tĩnh.

function chooseDialog(Object o, String s, Integer i) { 
    Method method = Dialogs.getMethod(o, Integer.class); 
    method.invoke(o, i); 
} 

Nhưng tôi không nghĩ rằng đây là cách OOP đúng để xử lý sự cố. Và dựa trên ý kiến ​​của bạn, sự phản chiếu không hoàn toàn cần thiết, và đã chọnDialog phân tích chuỗi và truyền nó tới phương thức thích hợp là cách tiếp cận an toàn hơn nhiều. Trong cả hai cách tiếp cận, kiểm tra đơn vị của bạn sẽ giống nhau.

if (s.equals("dialog1")) { 
     dialog1(i); 
    } 
Các vấn đề liên quan