在Java和C中在运行时调用名为“string”的方法

我们如何在运行时调用名称为string的方法。 任何人都可以告诉我如何在Java和C中做到这一点

在java中,它可以通过reflectionapi完成。

看看Class.getMethod(String methodName, Class... parameterTypes)

一个完整的例子(带有参数的非静态方法)将是:

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

哪个输出:

Hello World: 5

在Java中,您将使用reflection :

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

这是一个非常简单的情况,假设您的方法是静态的并且不带参数。 对于非静态方法,您将传入实例以调用该方法,并且在任何情况下,您都可以将任何必需的参数传递给invoke()方法调用。

这是一个基础C的例子,我希望它会对你有所帮助。

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

在Java中:

如果A类有一个方法“string()”,那么你可以通过以下方式调用它:

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

C没有方法,你不能调用它们。 您可能会想到C ++本质上具有完全相同的语法。

在Java中,您必须使用Java Reflection API来获取对表示方法的Method对象的引用,然后您可以执行该方法。

在C(或C ++)中,实际reflection是不可能的,因为它是一种编译语言。

最常用的是具有关联容器(映射),可以将函数名称(作为字符串)链接到函数指针。 您必须使用所需的值填充程序中的地图。 这不能自动完成。

你也可以简单地使用一个函数,它将一个字符串作为参数,然后选择正确的函数来调用手工制作的ifs。

我很确定你可以将所有函数放入共享库并使用dlopen + dlsym加载它们。