¿Cómo podemos llamar a un método cuyo nombre es cadena en tiempo de ejecución. ¿Alguien puede mostrarme cómo hacer eso en Java y C.Llamar a un método denominado "cadena" en el tiempo de ejecución en Java y C
Respuesta
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
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.
"en tiempo de ejecución" sugieren que el nombre del método no se determina en tiempo de compilación. – aioobe
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
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
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()
.
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.
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.
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");
}
+1 para el único acercamiento c – stacker
Eso sigue siendo una función y no un método, sin embargo. –
Estoy bastante seguro de que puede poner todas sus funciones en la biblioteca compartida y cargarlos con dlopen + dlsym.
- 1. C# llamar a un método estático en tiempo de ejecución sin una referencia de tiempo de compilación?
- 2. ¿Cómo llamar a un método en Java?
- 3. llamar a otro método en el principal método en Java
- 4. Llamar a un método estático en C#
- 5. C#: Obtener parámetro de tipo en tiempo de ejecución a pasar a un método genérico
- 6. Llamar a cualquier método Java desde C#
- 7. Establecer el límite de tiempo de ejecución en un método en java
- 8. C# Método de anulación en tiempo de ejecución
- 9. Mida el tiempo de ejecución en C#
- 10. Llamar a un método genérico usando expresiones Lambda (y un tipo conocido solo en tiempo de ejecución)
- 11. modificar un método/función en el tiempo de ejecución
- 12. ¿Cómo adjunto un método a un tipo de C# creado dinámicamente en tiempo de ejecución?
- 13. Llamar a un método de subclase en Java
- 14. Llamar a una función genérica con un parámetro de tipo determinado en el tiempo de ejecución
- 15. Llamar a un método genérico java sobrecargada de Scala
- 16. Agregar archivos a Java classpath en el tiempo de ejecución
- 17. Cambiar un método en tiempo de ejecución a través de un mecanismo de intercambio en caliente
- 18. Cómo inyectar IL en un método en tiempo de ejecución
- 19. C# Llamar a un método en un nuevo hilo
- 20. método de llamada en tiempo de ejecución
- 21. ¿Cómo envío a un método basado en el tipo de tiempo de ejecución de un parámetro en C# <4?
- 22. Método de tiempo de espera en java
- 23. Llamar a un método en Constructor
- 24. primavera y el paso de parámetros a la fábrica-método en el tiempo de ejecución
- 25. C# Pass genéricos en tiempo de ejecución
- 26. Cómo prohibir llamar a un método C#
- 27. Llamar a un método genérico por reflejo en java
- 28. Recopilación en tiempo de ejecución y en tiempo de ejecución C#
- 29. Java: resolución de método de tiempo de ejecución
- 30. compilador de clases java y compilación en tiempo de ejecución
Esto no se puede hacer en C. C no tiene métodos. –
Ni C++: D – Tom