2012-06-13 13 views
14

Qui è la mia classe:Come utilizzare la riflessione per richiamare un metodo con parametri?

public class A{ 
    private void doIt(int[] X, int[] Y){ 
     //change the values in X and Y 
    } 
} 

ho un'altra classe che sta cercando di usare doIt per modificare due array. Ho un errore nel mio codice ma non riesco a trovarlo.

public class B{ 
    public void myStuff(){ 
    A myA = new A(); 
    int[] X = {1,2,3,4,5}; 
    int[] Y = {4,5,6,7,8,9}; 
    Method doIt = A.class.getDeclaredMethod("doIt",new Object[]{X,Y}); // error 
    doIt.setAccessible(true); 
    doIt.invoke(myA,new Object[]{X,Y}); 
    } 
} 

Qualsiasi aiuto su come risolvere il metodo myStuff?

Se utilizzo il codice getDeclaredMethod("doIt",new Object[]{X,Y});, il codice non viene compilato.

Se invece ho getDeclaredMethod("doIt",null); quindi dice NoSuchMethodException.

risposta

16

Il tuo metodo è dichiarato con due array int

private void doIt(int[] X, int[] Y) 

e se si wan per scoprire che il metodo è necessario anche mettere i suoi tipi di argomenti per evitare di trovare un altro metodo con lo stesso nome ma diversi tipi.

A.class.getDeclaredMethod("doIt", int[].class, int[].class) 
+0

Grazie mille MOLTO! +1 – kasavbere

4

Il metodo doIt richiede due parametri. Di conseguenza è necessario passare due parametri, oltre al nome del metodo, a Class#getDeclaredMethod(). I due parametri aggiuntivi devono essere istanze di Class, che un Object[] è ovviamente non. In particolare, le istanze Class devono essere uguali ai tipi di parametri accettati da doIt.

Method doIt = A.class.getDeclaredMethod("doIt", int[].class, int[].class); 
+0

Grazie MOLTO! +1 – kasavbere

3

Non dovrebbe essere?

Method doIt = A.class.getDeclaredMethod("doIt", int[].class, int[].class); 
+0

Grazie MOLTO MOLTO! +1 – kasavbere

Problemi correlati