2012-08-12 22 views
6

Quindi, ho un problema strano. Questa espressione: method.invoke(target, null) tiri java.lang.IllegalArgumentException: numero errato di argomentivarargs e argomento nullo

Il problema è che questa espressione è profondo ibernazione all'interno (BasicPropertyAccessor $ BasicGetter per la precisione) e credo che dovrebbe funzionare bene (lo ha fatto fino a poco tempo)

Ho eseguito il debug di questo problema in eclissi e, in effetti, se io (in Visualizza visualizzazione) chiama method.invoke(target) o method.invoke(target, (Object[]) null), tutto funziona correttamente. Sono sicuro che la mia classe ha questo getter e non ha argomenti. Quindi ... la domanda è, che diavolo sta succedendo ?!

EDIT:

  • metodo è un'istanza di java.lang.reflect.Method e punti a detto getter
  • destinazione è un'istanza della classe con pubblico X coordinatax() getter
  • JDK 1.6.0_31
  • codice Hibernate (BasicPropertyAccessor: 143):

    public Object get(Object target) throws HibernateException { 
        try { 
         return method.invoke(target, null); 
        } 
        catch{ ... } 
    } 
    
+0

Quale metodo stai tentando di richiamare? – Jeffrey

+0

session.flush(): P Ma alla fine, hibernate sta cercando di richiamare il getter – mabn

+0

qual è la firma del metodo? – Bohemian

risposta

8

Quando si passa un valore null a un metodo varargs, essa potrebbe essere interpretata come una delle due cose:

  • Un null matrice
  • Un array con un elemento che è null.

Java sceglie il primo, a meno che lo null non venga trasmesso esplicitamente al tipo di componente del metodo varargs. (Si consiglia di eseguire esplicitamente un avviso in Eclipse in caso contrario.)

Quando si invocano metodi senza argomenti, è possibile passare Method.invoke un array con 0 elementi, senza argomenti supplementari (che si tradurrà in un array vuoto) o una matrice null:

public class MethodInvoke { 
    public static void noParams() { 
     System.out.println("noParams called"); 
    } 

    public static void main(String[] args) throws NoSuchMethodException, 
      SecurityException, IllegalAccessException, 
      IllegalArgumentException, InvocationTargetException { 
     Method noParams = MethodInvoke.class.getMethod("noParams"); 
     Object target = null; 
     noParams.invoke(target, new Object[0]); 
     noParams.invoke(target); 
     noParams.invoke(target, null); 
     noParams.invoke(target, (Object[]) null); 
     noParams.invoke(target, (Object) null); // wrong number of arguments 
    } 
} 

quello che sembra accadere è che method.invoke(target, null) viene interpretata come method.invoke(target, (Object) null). Questo è incoerente con il modo in cui si suppone che Java si comporti.

Sei assolutamente sicuro che il tuo metodo non abbia parametri?

Ho anche notato che nella versione più recente di hibernate ha espressamente lanciato quello null in Object[].

+0

bene, ho cancellato repository maven, database ricreato, spazio di lavoro, .project e file .classpath e ha iniziato a funzionare. Non ho ancora idea del perché si sia comportato così strano. – mabn

+0

@mabn Sì, questo è un bug davvero strano. Almeno se ritorna a morderti di nuovo saprai cosa fare – Jeffrey

0

Se la firma del metodo è public X getX(), allora ci sono presenti parametri, così chiamata in questo modo:

method.invoke(target); 

Il primo parametro del metodo invoke() è l'istanza su cui richiamare il metodo .

Si noti che per i metodi varargs, il modo in cui si specificano i parametri con virgole esempio method(a, b, c) è zucchero sintattico per method(new Object[]{a, b, c}: il tipo di parametro formale è Object[].

+0

Questo non dovrebbe importare. Vedi la mia risposta – Jeffrey

+0

Non riesco a cambiare l'espressione di quella che hai fornito, la sospensione lo invoca. – mabn

Problemi correlati