2015-09-03 17 views
7

Çok önemli bir şeyi özlemeliyim. Bir yöntem çağırma sırasında herhangi bir türden bir dizi geçmek çalıştığınızda bir hata alıyorum. Ancak normal yaptığım zaman çalışır.Yöntem çağırma sırasında bir Diziyi parametre olarak iletirken IllegalArgumentException

Bu durum ya Btw çalışmıyor

Exception in thread "main" java.lang.IllegalArgumentException: argument type mismatch 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:497) 
at Main.main(Main.java:11) 

String... atılan

import java.lang.reflect.Method; 

public class Main { 
    public static void main(String[] args) throws Exception { 

     // Normal 
     MyClass.sayHello(new String[] {"StackOverflow"}); 

     // Reflection 
     Method m = MyClass.class.getMethod("sayHello", String[].class); 
     m.invoke(null, new String[]{"StackOverflow"}); 
    } 

    static class MyClass { 
     public static void sayHello(String[] args) { 
      System.out.println("Hello " + args[0]); 
     } 
    } 
} 

başarısız tam koddur.

cevap

7

Sorun, ikinci parametrenin invoke için bir argüman dizisi olması gerektiğidir - yalnızca tek bir bağımsız değişken belirttiniz.

Çoğu durumda bu, Method.invoke'un ikinci parametresi bir varargs parametresi olarak doğru olur, ancak argümanınız zaten Object[] ile uyumlu bir dizi olduğundan, derleyici bir sarmalayıcı dizisi oluşturmaz.

Main.java:11: warning: non-varargs call of varargs method with inexact argument type for 
         last parameter; 
     m.invoke(null, new String[]{"StackOverflow"}); 
        ^
    cast to Object for a varargs call 
    cast to Object[] for a non-varargs call and to suppress this warning 

Ya açıkça argüman saran bir dizi oluşturabilir veya derleyici bunu kendisi sarmak gerekiyor böylece Object için argüman döküm olabilir:

Sana bir derleme zamanı böyle uyarı almak için beklersiniz
// Creates the wrapper array explicitly 
m.invoke(null, new Object[] { new String[] { "StackOverflow" } }); 

veya

// Compiler creates the wrapper array because the argument type is just Object 
m.invoke(null, (Object) new String[] { "StackOverflow" }); 
+0

TLDR: her zaman olduğu gibi RTFD – mvd

+0

Evet, aynı uyarıyı aldım. Java'nın bir dizi dizi argümanına neden ihtiyaç duyduğu hiç bir anlam ifade etmiyor, ama işe yarıyor. Teşekkürler! – TomTom

+0

@TomTom: Bu mükemmel bir anlam ifade ediyor: bir dizi gerekiyor çünkü çoklu argümanlar olabilir. Bu dizinin tek elemanı bir dizidir, çünkü yönteme parametresi bir dizidir. Yönteme başka bir parametre eklemeyi deneyin ve daha mantıklı olacaktır. Ve gelecekte, * asla * uyarıları ihmal etmeyin :) –