在 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”的方法的主要内容,如果未能解决你的问题,请参考以下文章

通过反射动态执行对象的方法的步骤是啥

如何在不相关的类型上实现动态多态(运行时调用调度)?

iOS:如何使用目标 c 实现搜索控制器以及如何在运行时调用 API,即当我开始输入搜索控制器时?

java之反射

每天学一点JAVA

didUpdateUserLocation 未在重新加载视图时调用