Как мы можем назвать метод, какое имя является строкой во времени выполнения. Может любой показывать мне, как сделать это в Java и C.
В 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
В Java:
Если у класса A есть метод "string ()", вы вызываете его по:
A a = new A();
a.string();
C не имеет методов, и вы не можете их вызывать. Возможно, вы думаете о C ++, который, по сути, имеет точно такой же синтаксис.
В Java вы бы использовали reflection:
Class<?> classContainingTheMethod = ...; // populate this!
Method stringMethod = classContainingTheMethod.getMethod("string");
Object returnValue = stringMethod.invoke(null);
Это очень простой случай, предполагающий, что ваш метод статичен и не принимает никаких параметров. Для нестатических методов вы передадите экземпляр для вызова метода, и в любом случае вы можете передать любые необходимые параметры в вызов метода invoke()
.
В Java вам придется использовать Java Reflection API, чтобы получить ссылку на объект Method, представляющий ваш метод, который вы можете затем выполнить.
В 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.