Вызов метода, названного “строкой” во времени выполнения в Java и C

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

5
задан aioobe 12 November 2017 в 10:54
поделиться

7 ответов

В 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

26
ответ дан 18 December 2019 в 05:23
поделиться

В Java:

Если у класса A есть метод "string ()", вы вызываете его по:

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

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

2
ответ дан 18 December 2019 в 05:23
поделиться

В Java вы бы использовали reflection:

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

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

3
ответ дан 18 December 2019 в 05:23
поделиться

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

2
ответ дан 18 December 2019 в 05:23
поделиться

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

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

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

2
ответ дан 18 December 2019 в 05:23
поделиться

Вот базовый пример 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");
}
3
ответ дан 18 December 2019 в 05:23
поделиться

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

0
ответ дан 18 December 2019 в 05:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: