2012-04-10 17 views
22

Tôi cố gắng để gọi phương pháp này trong Java phản tư:Làm thế nào để tôi gọi một phương thức một cách phản xạ bằng null với tư cách là đối số?

public void setFoo(ArrayList<String> foo) { this.foo = foo; } 

Vấn đề là tôi muốn vượt qua null như null, vì vậy foo đó trở thành null.

Tuy nhiên, trong cách tiếp cận sau đó giả định rằng không có đối số, và tôi nhận được IllegalArgumentException (wrong number of arguments):

method.invoke(new FooHolder(), null); 
// -----------------------------^ - I want null to be passed to the method... 

Làm thế nào là thực hiện?

+2

Khi 'varargs' biến thành xấu. – biziclop

Trả lời

51

Hãy thử

method.invoke(new FooHolder(), new Object[]{ null }); 
6

Cảnh báo biên dịch nên làm cho bạn nhận thức được vấn đề;

Các đối số kiểu rỗng một cách rõ ràng nên được đúc vào Object [] cho invocation của invoke phương pháp varargs (Object, Object ...) từ loại phương pháp. Nó có thể được chuyển sang Object cho một varargs invocation

Bạn có thể sửa nó như thế này;

Object arg = null; 
method.invoke(new FooHolder(), arg); 
3

Một chút giải thích cho các giải pháp đã được đăng.

Method.invoke() được khai báo là hàm biến thiên biến đổi và điều đó có nghĩa là thông thường bạn không cần tạo một mảng đối tượng một cách rõ ràng. Chỉ vì bạn vượt qua một tham số duy nhất, có thể được hiểu là một mảng đối tượng, không method.invoke(obj, null) không thành công.

Nếu ví dụ phương pháp của bạn có hai tham số, method.invoke(obj, null, null) sẽ hoạt động hoàn toàn tốt.

Tuy nhiên, nếu phương pháp của bạn có tham số Object[], bạn luôn phải quấn nó.

6

Đối với tôi, điều này không làm việc:

m.invoke (c.newInstance(), new Object [] {rỗng});

NHƯNG công trình này:

m.invoke (c.newInstance(), new Object [] {});

+2

Sau đó, có thể bạn đã có một phương pháp không có đối số –

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