2010-05-21 8 views

risposta

26

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

2

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.

+0

"in runtime" suggeriscono che il nome del metodo non è determinato in fase di compilazione. – aioobe

+0

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

+0

Probabilmente no. Ma pensavo di aggiungere la risposta esatta alla domanda che aveva posto, nel caso fosse quello che voleva. – DJClayworth

3

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().

2

In Java, è necessario utilizzare Java Reflection API per ottenere un riferimento all'oggetto Method che rappresenta il metodo, che è quindi possibile eseguire.

2

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.

3

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"); 
} 
+0

+1 per l'unico approccio c – stacker

+0

Questa è pur sempre una funzione e non un metodo. –

0

Sono abbastanza sicuro che si può mettere tutte le funzioni nella libreria condivisa e caricarli con dlopen + dlsym.

Problemi correlati