2012-03-07 25 views
5

Tôi đang sử dụng phản ánh để gọi một phương thức trên a class that is dynamically constructed at runtime:Gọi phương pháp thông qua phản ánh khi đối số là kiểu Object []

public String createJDBCProvider(Object[] args) 

Đây là cách:

Method m = adminTask.getClass().getMethod("createJDBCProvider", Object[].class); 
id = (String) m.invoke(adminTask, new Object[]{ "a", "b", "c" }); 

IDEA cảnh báo với tôi rằng tôi là phạm tội redundant array creation for calling varargs method.

Phương pháp tôi gọi thực sự mất Object[], không phải Object ... nhưng chúng có thể tương đương và có thể hoán đổi cho nhau mà tôi nghĩ, vì vậy tôi giả mạo trước.

Khi chạy tôi nhận được:

java.lang.IllegalArgumentException: wrong number of arguments 

Vì vậy, có vẻ như, có lẽ, Object[] của tôi đã được thông qua như là một chuỗi các Object s. Đây có phải là những gì đang xảy ra không? Nếu vậy, làm thế nào tôi có thể ép buộc nó để không làm như vậy?

+0

Bạn đặt gì vào vị trí của '...' trong mã thực tế là phần có liên quan nhất. Bạn có thể vui lòng hiển thị những gì trong mã thực của bạn? – dasblinkenlight

+0

Chỉ cần chuỗi. Đã cập nhật. – Synesso

+1

Varargs trong Java chỉ là cú pháp đường. Trình biên dịch biến 'Object ...' thành 'Object []'. Vì vậy, yeah, họ là tương đương. –

Trả lời

5

Cách bạn đang gọi phương thức, phản ánh cho rằng bạn đang truyền ba tham số riêng lẻ, thay vì tham số mảng đơn. Hãy thử điều này:

id = (String) m.invoke(adminTask, new Object[]{ new Object[] {"a", "b", "c"} }); 
+0

Ack, tôi đã nghĩ đến việc cố gắng nhưng không phải vì nó có vẻ quá khó. Cảm ơn. – Synesso

1

Hãy thử điều này:

Method m = adminTask.getClass().getMethod("createJDBCProvider", Object[].class); 
id = (String) m.invoke(adminTask, new String[]{ "a", "b", "c" }); 

Chữ ký của phương pháp invoke là public Object invoke(Object obj, *Object... args*) và Idea có kiểm tra kích hoạt khi đi qua một mảng khi một vararg cùng loại dự kiến ​​sẽ thay thế.

Các vấn đề liên quan