2011-04-07 23 views
14

çağrılması için açıkça Sınıf [] 'a atılmalıdır. Lütfen aşağıdaki örneğe bakın, ilk çağrı getMethod(), Eclipse'de bir Uyarı üretir. İkincisi çalışmıyor ve NoSuchMethodException ile başarısız.narar türü null argümanı, varargs yönteminin

The argument of type null should explicitly be cast to Class<?>[] for the invocation of the varargs method getMethod(String, Class<?>...) from type Class<Example> . It could alternatively be cast to Class for a varargs invocation.

Uyarıyı izledim ve artık hiçbir şey çalışmadı.

Exception in thread "main" java.lang.NoSuchMethodException: 
    Example.exampleMethod(null) 
     at java.lang.Class.getMethod(Class.java:1605) 
     at Example.main(Example.java:12) 

biri bana bu davranışı açıklayabilir:

import java.lang.reflect.Method; 


public class Example 
{ 
    public void exampleMethod() { } 

    public static void main(String[] args) throws Throwable 
    { 
    Method defaultNull = Example.class.getMethod("exampleMethod", null);   
    Method castedNull = Example.class.getMethod("exampleMethod", (Class<?>) null); 
} 
} 

ikinci çağrı bu hatayı üretir? Uyarıdan kaçınmanın doğru yolu nedir?

cevap

36

getMethod yönteminin ikinci parametresi bir VarArg bağımsız değişkeni. Doğru kullanım: Yansıtılan yöntemin bir parametresi yoksa, ikinci bir parametre belirtilmelidir. yansıyan yöntem parametresi vardır, böylece her parametre sonraki şekilde belirtilmelidir Eğer : senin durumunda,

Yani

import java.lang.reflect.Method; 


public class Example { 

    public void exampleMethodNoParam() { 
     System.out.println("No params"); 
    } 

    public void exampleMethodWithParam(String arg) { 
     System.out.println(arg); 
    } 

    public static void main(String[] args) throws Throwable { 
     Example example = new Example(); 
     Method noParam = Example.class.getMethod("exampleMethodNoParam"); 
     Method stringParam = Example.class.getMethod("exampleMethodWithParam", String.class); 
     noParam.invoke(example); 
     stringParam.invoke(example, "test"); 
     //output 
     //No params 
     //test 
    } 
} 

GÜNCELLEME, ne zaman derleyici bilmez null belirtmek neyi tür belirttiniz. Eğer bilinmiyorsa ama yine de sınıftır Bir sınıf, null döküm çalıştığınızda exampleMethod hiçbir

public void exampleMethod(Class<?> object) { }

imza olmadığından, bir özel durumu olsun.

+0

Dökümlü bir "null", yayınlanmamış bir "null" dan nasıl farklıdır? Bunu JDK kaynak kodunda göremiyorum. – codevour

+0

Lütfen güncellenen gönderiye bakın. – StKiller

1

ürününü Class<?>[]'a yüklemediniz, Class<?> ürününe aktardınız. Hiçbir yöntem bu imzayla eşleşmediğinden, istisnayı atar. Diziyi doğru şekilde tanımlamak için yayıncınızı düzeltin. Java API tanımlanan

+0

Null, Sınıfına dökünse bile, bunun işe yarayacağını düşünmüyorum ... Sonra, bir nesne için bir yöntemle yansıma aranacaktı. Hangi da mevcut değil. – mmccomb

4

getMethod olup:

: Eğer adı yöntemi, bağımsız değişkenler ise

Method java.lang.Class.getMethod(String name, Class<?>... parameterTypes) 

, o zaman boş bir dizi ya da ikinci argument.like bunun için 0 uzunluğu olan bir dizi vermelidir

Method defaultNull = Example.class.getMethod("exampleMethod", new Class<?>[0]); 

Yöntemi de çağırınız, boş bir dizi de ayarlamanız gerekir.

defaultNull.invoke(example , new Object[0]);