Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
调用名为“的方法”;“字符串”;在Java和C中运行时_Java_C_String_Runtime_Methods - Fatal编程技术网

调用名为“的方法”;“字符串”;在Java和C中运行时

调用名为“的方法”;“字符串”;在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

我们如何在运行时调用名为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(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");
}