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

时间:2010-05-21 14:29:45

标签: java c string runtime methods

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

7 个答案:

答案 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加载它们。