Вызов метода с именем «string» во время выполнения в Java и C - PullRequest
5 голосов
/ 21 мая 2010

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

Ответы [ 7 ]

26 голосов
/ 21 мая 2010

В 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

3 голосов
/ 21 мая 2010

Вот базовый пример 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 голосов
/ 21 мая 2010

В Java вы бы использовали отражение :

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

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

2 голосов
/ 21 мая 2010

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

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

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

2 голосов
/ 21 мая 2010

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

2 голосов
/ 21 мая 2010

В Java:

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

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

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

0 голосов
/ 19 июля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...