Вызов метода с именем «строка» во время выполнения на Java и C

Как мы можем назвать метод, имя которого является строкой во время выполнения. Может ли кто-нибудь показать мне, как это сделать на Java и C.

В java это можно сделать через reflection 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

В Java вы должны использовать reflection :

 Class classContainingTheMethod = ...; // populate this! Method stringMethod = classContainingTheMethod.getMethod("string"); Object returnValue = stringMethod.invoke(null); 

Это очень простой случай, предполагающий, что ваш метод статичен и не принимает никаких параметров. Для нестатических методов вы должны передать экземпляр для вызова метода, и в любом случае вы можете передать любые требуемые параметры вызову метода invoke() .

Вот пример 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"); } 

В Java:

Если class A имеет метод «string ()», то вы вызываете его:

 A a = new A(); a.string(); 

C не имеет методов, и вы не можете их назвать. Возможно, вы думаете о C ++, который по сути имеет точно такой же синтаксис.

В Java вам нужно будет использовать API Java Reflection для получения ссылки на объект Method, представляющий ваш метод, который вы затем можете выполнить.

В C (или C ++) реальное reflection невозможно, так как это скомпилированный язык.

Наиболее часто используется ассоциативный контейнер (карта), который может связывать имя функции (как строку) с указателем на функцию. Вы должны заполнить карту в программе желаемым значением. Это невозможно сделать автоматически.

Вы также можете просто иметь функцию, которая берет строку как параметр, а затем выбирает правильную функцию для вызова с помощью hand-made ifs.

Я уверен, что вы можете поместить все свои функции в общую библиотеку и загрузить их с помощью dlopen + dlsym.