Как мы можем назвать метод, имя которого является строкой во время выполнения. Может ли кто-нибудь показать мне, как это сделать на 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.