2009-11-18 15 views
5

Für eine wirklich abstrakte Anwendung, die ich erstelle, muss ich Methoden aufrufen, ohne ihre Parameter zu kennen und nur die Parameter in einer String-Form zu kennen.getClass(). GetMethod ("Name", unbekannt)

Sagen wir, ich habe die Methode;

getNames(String like, int amount); 

und ich habe eine Reihe von Strings mit den 2 Parametern, also sagen wir, ich habe;

String[] params = new String[] {"jack", "25"}; 

Gibt es eine Möglichkeit, dass ich diese Methode mit dem params-Array abrufen und aufrufen kann?

Antwort

2

könnten Sie


String[] params = new String[] {"jack", "25"}; 
Object[] realParams = new Object[params.length]; 
Method[] methods = getClass().getMethods(); 
for (Method method : methods) { 
    if (method.getParameterTypes().length == params.length) { 
    for (int i = 0; i < method.getParameterTypes().length; i ++) { 
     Class<?> paramClass = method.getParameterTypes()[i]; 
     if (paramClass = String.class) { 
      realParams.add(param); 
     } else if (paramClass == Integer.class || paramClass == Integer.TYPE) { 
      realParams.add(Integer.parseInt(param)); 
     } else if (other primitive wrappers) { 
      ... 
     } else { 
      realParams.add(null); // can't create a random object based on just string 
      // you can have some object factory here, or use ObjectInputStream 
     } 
    } 
    break; // you can continue here if the parameters weren't converted successfully,  
    //to attempt another method with the same arguments count. 
    } 
} 
+0

Wie kann ich die Strings auf den erforderlichen Parameter umwandeln, wenn Sie die Methode kennen, können Sie ein Beispiel geben? – Thys

+0

Mit dieser Lösung können Sie nicht zwei Methoden mit der gleichen Anzahl von Argumenten haben. Es ist unmöglich, dies auf diese Weise zu tun, es sei denn, Sie haben entweder den Namen der auszuführenden Methode oder die Typen der Parameter angegeben, die Sie verwenden möchten. –

+0

Überprüfen Sie mein Update – Bozho

1

Klingt wie Metaprogrammierung. Vielleicht möchten Sie in Groovy/Scala schauen, wenn Sie auf der JVM-Plattform eingestellt sind.

0

Schauen Sie sich die Java-Reflektions-APIs an. Sie sollten (obwohl ich mich nicht sicher erinnere) in der Lage sein, Ihnen die Informationen zu geben, die Sie benötigen, um die verschiedenen Arten von Parametern zu ermitteln. Sie müssten dann über die Liste iterieren und sie basierend auf dem, was die Reflection-API Ihnen über die Methode mitgeteilt hat, intelligent umwandeln.

0

Für die dynamische Programmierung versuchen, eine dynamische Programmiersprache verwenden. Java ist für solche Sachen nicht gut geeignet.

Werfen Sie einen Blick auf die Reflektions-API, aber wenn Sie planen, eine Menge Programmierung für Ihre Anwendung zu tun, ziehen Sie andere Alternativen in Betracht.

Verwandte Themen