在 Java 和 C 中在运行时调用名为“string”的方法
Posted
技术标签:
【中文标题】在 Java 和 C 中在运行时调用名为“string”的方法【英文标题】:Calling a method named "string" at runtime in Java and C 【发布时间】:2011-02-22 09:37:23 【问题描述】:我们如何在运行时调用名称为 string 的方法。谁能告诉我如何在 Java 和 C 中做到这一点。
【问题讨论】:
这不能在 C 中完成。C 没有方法。 【参考方案1】:在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
【讨论】:
【参考方案2】:在 Java 中:
如果 A 类有一个方法“string()”,那么你调用它:
A a = new A();
a.string();
C 没有方法,你不能调用它们。您可能会想到 C++,它本质上具有完全相同的语法。
【讨论】:
"in runtime" 提示编译时没有确定方法名。 不知何故,我认为这不是 OP 的意思。我将这个问题理解为动态函数解析 - 因此,Java 中的反射,而不是 C 中的函数指针查找表。 可能不会。但我想我会在他问的问题上加上确切的答案,以防他想要什么。 我们应该不使用 a = a.string();【参考方案3】:在 Java 中你会使用 reflection:
Class<?> classContainingTheMethod = ...; // populate this!
Method stringMethod = classContainingTheMethod.getMethod("string");
Object returnValue = stringMethod.invoke(null);
这是一个非常简单的案例,假设您的方法是静态的并且不带参数。对于非静态方法,您可以传入实例以调用该方法,并且在任何情况下,您都可以将任何必需的参数传递给invoke()
方法调用。
【讨论】:
【参考方案4】:在 Java 中,您必须使用 Java Reflection API 来获取对代表您的方法的 Method 对象的引用,然后您可以执行该对象。
【讨论】:
【参考方案5】:在 C(或 C++)中,真正的反射是不可能的,因为它是一种编译语言。
最常用的是有一个关联容器(映射),可以将函数名(作为字符串)链接到函数指针。您必须在程序中使用您想要的值填写地图。这不能自动完成。
您也可以简单地拥有一个以字符串作为参数的函数,然后选择正确的函数来使用手工制作的 ifs 调用。
【讨论】:
【参考方案6】:这是一个基本的 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");
【讨论】:
不过,这仍然是一个函数,而不是一个方法。【参考方案7】:我很确定您可以将所有函数放入共享库并使用 dlopen + dlsym 加载它们。
【讨论】:
以上是关于在 Java 和 C 中在运行时调用名为“string”的方法的主要内容,如果未能解决你的问题,请参考以下文章