如何在运行时调用名称为 string 的方法。任何人都可以告诉我如何在Java和C中做到这一点。
答案 0 :(得分:26)
在java中,它可以通过反射api来完成。
查看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
答案 1 :(得分:3)
在Java中,您将使用reflection:
Class<?> classContainingTheMethod = ...; // populate this!
Method stringMethod = classContainingTheMethod.getMethod("string");
Object returnValue = stringMethod.invoke(null);
这是一个非常简单的情况,假设您的方法是静态的并且不带参数。对于非静态方法,您将传入实例以调用该方法,并且在任何情况下,您都可以将任何必需参数传递给invoke()
方法调用。
答案 2 :(得分:3)
这是一个基础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");
}
答案 3 :(得分:2)
在Java中:
如果A类有一个方法“string()”,那么你可以通过以下方式调用它:
A a = new A();
a.string();
C没有方法,您无法调用它们。您可能会想到C ++本质上具有完全相同的语法。
答案 4 :(得分:2)
在Java中,您必须使用Java Reflection API来获取对代表您的方法的Method对象的引用,然后您可以执行该对象。
答案 5 :(得分:2)
在C(或C ++)中,实际反射是不可能的,因为它是一种编译语言。
最常用的是具有关联容器(映射),可以将函数名称(作为字符串)链接到函数指针。您必须使用所需的值填充程序中的地图。这不能自动完成。
你也可以简单地使用一个函数,它将一个字符串作为参数,然后选择正确的函数来调用手工制作的ifs。
答案 6 :(得分:0)
我很确定你可以将所有函数放入共享库并使用dlopen + dlsym加载它们。