Come possiamo chiamare un metodo il cui nome è stringa in fase di esecuzione. Qualcuno può mostrarmi come farlo in Java e C.Chiamare un metodo denominato "stringa" in fase di esecuzione in Java e C
risposta
In java può essere fatto attraverso la riflessione api.
Dai un'occhiata allo Class.getMethod(String methodName, Class... parameterTypes)
.
Un esempio completo (di un metodo non statico con un argomento) sarebbe:
import java.lang.reflect.*;
public class Test {
public String methodName(int i) {
return "Hello World: " + i;
}
public static void main(String... args) throws Exception {
Test t = new Test();
Method m = Test.class.getMethod("methodName", int.class);
String returnVal = (String) m.invoke(t, 5);
System.out.println(returnVal);
}
}
quali uscite:
Hello World: 5
In Java:
Se classe A ha un metodo "stringa()", quindi lo chiamate da:
A a = new A();
a.string();
C non ha metodi e non è possibile chiamarli. Potresti pensare al C++ che essenzialmente ha esattamente la stessa sintassi.
"in runtime" suggeriscono che il nome del metodo non è determinato in fase di compilazione. – aioobe
In qualche modo non penso che questo significhi l'OP. Comprendo la domanda come risoluzione della funzione dinamica - quindi, riflessione in Java, e non del tutto ma vicino, tabella di ricerca del puntatore di funzione in C. – Amadan
Probabilmente no. Ma pensavo di aggiungere la risposta esatta alla domanda che aveva posto, nel caso fosse quello che voleva. – DJClayworth
In Java si usa reflection:
Class<?> classContainingTheMethod = ...; // populate this!
Method stringMethod = classContainingTheMethod.getMethod("string");
Object returnValue = stringMethod.invoke(null);
Questo è un caso molto semplice che presuppone che il metodo è statico e non accetta parametri. Per i metodi non statici, si passa all'istanza per richiamare il metodo e, in ogni caso, è possibile passare tutti i parametri richiesti alla chiamata al metodo invoke()
.
In Java, è necessario utilizzare Java Reflection API per ottenere un riferimento all'oggetto Method che rappresenta il metodo, che è quindi possibile eseguire.
In C (o C++) la riflessione reale non è possibile in quanto è un linguaggio compilato.
Il più utilizzato è disporre di un contenitore associativo (una mappa) in grado di collegare un nome di funzione (come una stringa) a un puntatore di funzione. Devi compilare la mappa nel programma con il valore che desideri. Questo non può essere fatto automaticamente.
Si potrebbe anche semplicemente avere una funzione che prende una stringa come parametro e quindi ha scelto la funzione giusta per chiamare con ifs fatti a mano.
Ecco un esempio di base C, spero che possa aiutarti.
typedef void (*fun)(void);
static void hello()
{
puts("hello world");
}
static void string()
{
puts("string");
}
static void unknown()
{
puts("unknown command");
}
struct cmd
{
char* name;
void (*fun) (struct cmd* c);
};
static struct cmd commands[] = {
{ "hello", hello },
{ "string", string },
{ 0, unknown }
};
static void execute(const char* cmdname)
{
struct cmd *c = commands;
while (c->name && strcmp (cmdname, c->name))
c++;
(*c->fun) (c);
}
int main()
{
execute("hello");
execute("string");
execute("qwerty");
}
+1 per l'unico approccio c – stacker
Questa è pur sempre una funzione e non un metodo. –
Sono abbastanza sicuro che si può mettere tutte le funzioni nella libreria condivisa e caricarli con dlopen + dlsym.
- 1. metodo call in fase di esecuzione
- 2. C# chiama un metodo statico in fase di esecuzione senza un riferimento del tempo di compilazione?
- 3. Come iniettare IL in un metodo in fase di esecuzione
- 4. Chiamare un metodo di sottoclasse in Java
- 5. Esecuzione del codice java compilato in fase di esecuzione
- 6. Caricamento di DLL in fase di esecuzione in C#
- 7. C# Crea e modifica classe in fase di esecuzione
- 8. Chiamare un metodo java in jsp
- 9. Implementazione dell'interfaccia in fase di esecuzione: metodo get_Value non implementato
- 10. C++ Assegnare un valore const in fase di esecuzione?
- 11. Come definire un oggetto C# in fase di esecuzione?
- 12. Aggiunta di annotazioni Java in fase di esecuzione
- 13. Come chiamare un metodo statico in C#
- 14. Aggiungi percorso cammello in fase di esecuzione in Java
- 15. Come cambiare lingua in fase di esecuzione in java swing
- 16. Compilazione classe Groovy in fase di esecuzione in Java
- 17. php creare il metodo di classe in fase di esecuzione
- 18. Impostazione tipo generico in fase di esecuzione
- 19. Utilizzo di una stringa come variabile in fase di esecuzione
- 20. Chiamare il metodo C# all'interno di un programma Java
- 21. Il metodo sovrascritto del genitore può chiamare java in altri oggetti ma non in un sottotipo?
- 22. Selezionare argomento template in fase di esecuzione in C++
- 23. Impostazione del valore enum in fase di esecuzione in C#
- 24. Impostare la stringa di connessione di Entity Framework in fase di esecuzione in C#
- 25. Chiamare una funzione generica con un parametro di tipo determinato in fase di esecuzione
- 26. Aggiunta di file a classpath java in fase di esecuzione
- 27. Caricamento giare in fase di esecuzione
- 28. Modifica implementazione/classe in fase di esecuzione
- 29. Stringa letterale Java: set di caratteri errato in fase di esecuzione
- 30. C++ dimensione di memoria dinamica in fase di esecuzione
Questo non può essere eseguito in C. C non ha metodi. –
Né C++: D – Tom