2013-01-24 54 views
5

Vì vậy, tôi đang cố gắng gọi một hàm tạo lớp khi chạy. Tôi có đoạn mã sau:Lỗi phản chiếu Java: Số lượng đối số sai

String[] argArray = {...}; 
... 
Class<?> tempClass = Class.forName(...); 
Constructor c = tempClass.getConstructor(String[].class); 
c.newInstance(argArray); 
... 

Bất cứ khi nào tôi biên dịch mã và chuyển cho lớp, tôi nhận được IllegalArgumentException: số lượng đối số sai. Hàm khởi tạo của lớp mà tôi đang gọi lấy trong String [] làm đối số duy nhất. Điều gì cũng lạ là nếu tôi thay đổi constructor để lấy một số nguyên và sử dụng Integer.TYPE và gọi c.newInstance (4) hoặc một cái gì đó, nó hoạt động. Ai đó có thể giải thích cho tôi những gì tôi đang làm sai? Cảm ơn bạn.

Chỉnh sửa ;; Toàn bộ lỗi:

java.lang.IllegalArgumentException: wrong number of arguments 
[Ljava.lang.String;@2be3d80c 
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source) 
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source) 
at java.lang.reflect.Constructor.newInstance(Unknown Source) 
+0

Bạn có thể đăng lỗi hoàn chỉnh không? –

+0

Đã thêm dấu vết ngăn xếp :) – de1337ed

Trả lời

7

Tôi không chắc chắn nếu nó là việc sửa chữa tốt nhất nhưng điều này nên làm việc:

c.newInstance((Object)argArray); 
+0

Tại sao lại hoạt động! Tại sao tôi cần phải chuyển sang đối tượng? – de1337ed

+2

Nếu không có Object [] wrapper newInstance cố gắng truyền nhiều đối số String cho một hàm tạo đối số đơn. Thông báo ngoại lệ thay đổi từ (java.lang.IllegalArgumentException: loại đối số không khớp) thành (java.lang.IllegalArgumentException: sai số đối số) tùy thuộc vào kích thước của mảng Chuỗi. – jdb

9

này đang xảy ra vì newInstance(Object...) mất varargs của Object, nói cách khác Object[]. Vì mảng là covariant, một String[] cũng là Object[]argArray đang được hiểu là tất cả đối số thay vì đối số đầu tiên.

jdb's solution hoạt động vì nó ngăn trình biên dịch hiểu nhầm. Bạn cũng có thể viết:

c.newInstance(new Object[] {argArray}); 
Các vấn đề liên quan