调用名为“的方法”;“字符串”;在Java和C中运行时
我们如何在运行时调用名为string的方法。有人能告诉我如何在Java和C中实现这一点吗?在Java中,可以通过反射api实现 看一看 一个完整的示例(带参数的非静态方法)是:调用名为“的方法”;“字符串”;在Java和C中运行时,java,c,string,runtime,methods,Java,C,String,Runtime,Methods,我们如何在运行时调用名为string的方法。有人能告诉我如何在Java和C中实现这一点吗?在Java中,可以通过反射api实现 看一看 一个完整的示例(带参数的非静态方法)是: import java.lang.reflect.*; public class Test { public String methodName(int i) { return "Hello World: " + i; } public static void main(Str
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);
}
}
哪些产出:
你好世界:5
在Java中:
如果类A有一个方法“string()”,那么您可以通过以下方式调用它:
A a = new A();
a.string();
C没有方法,您不能调用它们。你可能会想到C++,它的语法基本上是完全相同的。 在爪哇你会用:
类classContainingTheMethod=…;//填充这个!
方法stringMethod=classContainingTheMethod.getMethod(“字符串”);
对象returnValue=stringMethod.invoke(null);
这是一个非常简单的案例,假设您的方法是静态的,不带任何参数。对于非静态方法,您需要传入实例以在上调用该方法,并且在任何情况下,您都可以向
invoke()
方法调用传入任何必需的参数。在Java中,您必须使用获取表示方法的对象的引用,然后可以执行该引用。在C(或C++)中真正的反射是不可能的,因为它是一种编译语言
最常用的是有一个关联容器(映射),可以将函数名(作为字符串)链接到函数指针。你必须在程序中用你想要的值填充地图。这不能自动完成
您也可以简单地使用一个以字符串为参数的函数,然后选择正确的函数来使用手工制作的ifs进行调用。下面是一个基本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");
}
我很确定您可以将所有函数放入共享库,并使用dlopen+dlsym加载它们。这不能在C中完成。C没有方法。“在运行时”表示方法的名称不是在编译时确定的。我不认为这是OP的意思。我把这个问题理解为动态函数解析——因此,Java中的反射,而不是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");
}