2013-04-11 14 views
8

Sto tentando di scrivere un metodo per eseguire un metodo statico da un'altra classe passando una serie di stringhe come argomenti al metodo.Metodo di richiamo con un parametro dell'array mediante la riflessione

Ecco quello che ho:

public static void 
executeStaticCommand(final String[] command, Class<?> provider) 
{ 
    Method[] validMethods = provider.getMethods(); 

    String javaCommand = TextFormat.toCamelCase(command[0]); 

    for (Method method : validMethods) { 
     if (method.getName().equals(javaCommand)) { 
      try { 
       method.invoke(null, new Object[] { new Object[] { command } }); 
      } catch (IllegalAccessException e) { 
       e.printStackTrace(); 
      } catch (InvocationTargetException e) { 
       Throwable ex = e.getCause(); 
       ex.printStackTrace(); 
      } 
      break; 
     } 
    } 
} 

tale che questo:

String[] args = new String[] { "methodName", "arg1", "arg2" }; 
executeStaticCommand(args, ClassName.class); 

dovrebbe eseguire:

public class ClassName { 
    public static void methodName(String[] args) { 
     assert args[1].equals("arg1"); 
    } 
} 

Tuttavia mi sto IllegalArgumentException s.

risposta

9

Si hanno due problemi:

  1. Il tipo di parametro di riferimento è String[], ma si sta passando un Object[]
  2. Si sta passando all'intero array di comandi come argomenti, che include il nome del metodo

I problemi sono tutti nel blocco interno try, quindi mostro solo quel codice.

String[] args = Arrays.copyOfRange(command, 1, command.length - 1); 
method.invoke(null, new Object[]{args}); // must prevent expansion into varargs 

Grazie a Perception per ricordarmi del problema varargs

+1

Stavo solo scrivendo, più un ulteriore miglioramento che può fare. È necessario cambiare il richiamo a 'method.invoke (null, new Object [] {args})' affinché funzioni. – Perception

+0

@Perception ma il parametro del metodo di destinazione è 'String []', non 'String, String'. Non funziona (non ho un editor java a portata di mano qui)? – Bohemian

+1

Non funziona perché l'array viene espanso nei vararg, causando la mancata corrispondenza tra i tipi di firma e argomento. – Perception

0

Il metodo che il tentativo di invocare è previsto per l'array di stringhe, tuttavia si passa all'array dell'oggetto come param. Passa a Array di stringhe Oppure puoi passare qualsiasi tipo se il metodo si aspetta Object.

method.invoke (null, (Object) comando);

+0

Quando uso '(Object) comando', se' command.length' è 1, il metodo viene chiamato in modo corretto, un po 'se si tratta di ' > 1', non viene chiamato alcun metodo. – azz

0

Sulla base di this question, sembra che la chiamata dovrebbe essere

method.invoke(null, command); 
Problemi correlati