2010-05-21 21 views

Respuesta

26

En Java se puede hacer a través de la API de reflexión.

Eche un vistazo a Class.getMethod(String methodName, Class... parameterTypes).

Un ejemplo completo (de un método no estático con un argumento) sería:

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); 
    } 
} 

que da salida:

Hello World: 5

2

En Java:

Si la clase A tiene un método "string()" luego lo llamas por:

A a = new A(); 
a.string(); 

C no tiene métodos y no puede llamarlos. Usted puede estar pensando en C++ que esencialmente tiene exactamente la misma sintaxis.

+0

"en tiempo de ejecución" sugieren que el nombre del método no se determina en tiempo de compilación. – aioobe

+0

De alguna manera no creo que eso sea lo que significaba el OP. Entiendo la pregunta como resolución de función dinámica, por lo tanto, reflejo en Java, y no exactamente, pero cercano, tabla de búsqueda de puntero a función en C. – Amadan

+0

Probablemente no. Pero pensé que agregaría la respuesta exacta a la pregunta que hizo, en caso de que fuera lo que él quería. – DJClayworth

3

En Java que usaría reflection:

Class<?> classContainingTheMethod = ...; // populate this! 
Method stringMethod = classContainingTheMethod.getMethod("string"); 
Object returnValue = stringMethod.invoke(null); 

Este es un caso muy simple que supone que su método es estático y no toma ningún parámetro. Para los métodos no estáticos, debe pasar la instancia para invocar el método y, en cualquier caso, puede pasar los parámetros necesarios a la llamada al método invoke().

2

En Java, tendrá que usar el Java Reflection API para obtener una referencia al objeto Method que representa su método, que luego puede ejecutar.

2

En C (o C++) la reflexión real no es posible ya que es un lenguaje compilado.

El más utilizado es tener un contenedor asociativo (un mapa) que puede vincular un nombre de función (como una cadena) a un puntero de función. Debe completar el mapa en el programa con el valor que desea. Esto no puede hacerse automáticamente.

También podría simplemente tener una función que tome una cadena como parámetro y luego elija la función correcta para llamar con ifs hechos a mano.

3

Aquí hay un ejemplo de la base C, espero que lo ayude.

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 para el único acercamiento c – stacker

+0

Eso sigue siendo una función y no un método, sin embargo. –

0

Estoy bastante seguro de que puede poner todas sus funciones en la biblioteca compartida y cargarlos con dlopen + dlsym.

Cuestiones relacionadas