Вопрос

Если у меня есть имена функций, хранящиеся в виде строк в Hashtable.
Есть ли способ получить доступ к функциям через сохраненные строки?

Редактировать Я боюсь, что платформа, которую я работаю над CLDC1.1/MIDP2.0, не поддерживает отражение.
Возможен ли обходной путь?

Это было полезно?

Решение

Просто используйте большой длинный список else-if:

[...]
} else if ("foo".equals(function)) {
    target. foo();
} else if ("bar".equals(function)) {
    target. bar();
[...]

(Хотя мне обычно не нравятся попытки вертикального выравнивания в исходном коде, я думаю, что в подобных случаях оно того стоит.)

Сохранение функтора в карте является альтернативой, но может слишком сильно увеличить размер объекта для многих приложений MIDP.

Другие советы

Class.forName() и newInstance() должны присутствовать в MIDP 1.1 и могут быть полезны.Поскольку у вас нет полного отражения, вы можете создать класс, который упаковывает все вызовы функций и вызывает их.Предполагается, что вы заранее знаете все вызовы функций.

Вам понадобятся ссылки на все объекты, если вы не выполняете статические вызовы.Немного грязно, но работу бы выполнил.

public Object invoke(String name, Object[] args) {
   Object f = functionMap.get(name);
   if("f1".equals(name)) {
       return ((SomeInterface1)f).someFunction1((SomeArg0) args[0]), ...);
   } else if ("f2".equals(name)) {
       return ((SomeInterface2)f).someFunction2((SomeArg0) args[0]), ...);
   }...{
   } else if ("fN".equals(name)) {
       return ((SomeInterfaceN)f).someFunctionN((SomeArg0) args[0]), ...);
   }
}

Учитывая имя функции, вы можете использовать отражение для доступа к методу.Помимо имени функции, вам необходимо знать ее класс и иметь (или создать с помощью отражения, если у нее есть конструктор noarg или вы знаете, какие параметры передать конструктору) экземпляр (если метод не статический), и вы необходимо знать параметры, необходимые для передачи ему.

Другой вариант — использовать класс Method в качестве указателя на функцию.Его преимущество заключается в том, что он знает свой класс и требования к его параметрам.Его недостатком является невозможность сериализации.

РЕДАКТИРОВАТЬ:В Java невозможно получить доступ к методу без отражения, просто указав его имя в виде строки.Если вам нужен альтернативный указатель на метод, вы можете использовать анонимный внутренний класс, который вызывает нужный вам метод, реализующий известный интерфейс, и передает его на вашу карту.Это не подходит в качестве ключа карты, но будет работать как значение на карте.

Я не пробовал отражение в javame, но в javase вы можете использовать отражение для динамического вызова метода.

Следующий фрагмент взят из:http://java.sun.com/developer/technicalArticles/ALT/Reflection/

import java.lang.reflect.*;

Открытый метод класса2 {public int add (int a, int b) {return a + b;}

  public static void main(String args[])
  {
     try {
       Class cls = Class.forName("method2");
       Class partypes[] = new Class[2];
        partypes[0] = Integer.TYPE;
        partypes[1] = Integer.TYPE;
        Method meth = cls.getMethod(
          "add", partypes);
        method2 methobj = new method2();
        Object arglist[] = new Object[2];
        arglist[0] = new Integer(37);
        arglist[1] = new Integer(47);
        Object retobj 
          = meth.invoke(methobj, arglist);
        Integer retval = (Integer)retobj;
        System.out.println(retval.intValue());
     }
     catch (Throwable e) {
        System.err.println(e);
     }
  }

}

РЕДАКТИРОВАТЬ:Вместо использования if...then...else вы можете на самом деле захотеть передать число и использовать переключатель, так как его будет легче читать, IMO.

Но, тем не менее, это, вероятно, ваш единственный вариант, учитывая ограничения JavaME.

Я занимаюсь подобными проблемами в Хекл, интерпретатор, работающий на J2ME.Это в некотором роде зависит от того, с каким количеством строк вы хотите иметь дело, но один из работающих методов — использовать хеш для поиска целого числа, а затем использовать его в операторе переключения вместо большого списка операторов if/then.Кстати, вы можете использовать исходный код Hecl;он доступен по либеральной лицензии Apache.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top