LINUX.ORG.RU

Алгоритм поиска перегруженного метода в Java

 ,


0

3

Вот пытаюсь сообразить (параллельно скачивая openjdk репу) как эффективнее реализовать поиск нужного метода для вызова с определенным набором параметров. С учетом того, что метод перегружен. Нужен общий алгоритм, для всех ситуаций. Фактически нужно то, что использует эклипс или сама джава. Пока буду рыться в сырцах, может кто на пальцах объяснит?

★★★★★

Ответ на: комментарий от stevejobs

Все методы, т.е. я внутри класса вызываю this.foo(...) и оно начинает искать нужный this.foo метод. Я в hotspot пока нашел вот это:

  private static Method findMethod(ObjArray methods, Symbol name, Symbol signature) {
    int len = (int) methods.getLength();
    // methods are sorted, so do binary search
    int l = 0;
    int h = len - 1;
    while (l <= h) {
      int mid = (l + h) >> 1;
      Method m = (Method) methods.getObjAt(mid);
      int res = m.getName().fastCompare(name);
      if (res == 0) {
        // found matching name; do linear search to find matching signature
        // first, quick check for common case
        if (m.getSignature().equals(signature)) return m;
        // search downwards through overloaded methods
        int i;
        for (i = mid - 1; i >= l; i--) {
          Method m1 = (Method) methods.getObjAt(i);
          if (!m1.getName().equals(name)) break;
          if (m1.getSignature().equals(signature)) return m1;
        }
        // search upwards
        for (i = mid + 1; i <= h; i++) {
          Method m1 = (Method) methods.getObjAt(i);
          if (!m1.getName().equals(name)) break;
          if (m1.getSignature().equals(signature)) return m1;
        }
        // not found
        if (Assert.ASSERTS_ENABLED) {
          int index = linearSearch(methods, name, signature);
          if (index != -1) {
            throw new DebuggerException("binary search bug: should have found entry " + index);
          }
        }
        return null;
      } else if (res < 0) {
        l = mid + 1;
      } else {
        h = mid - 1;
      }
    }
    if (Assert.ASSERTS_ENABLED) {
      int index = linearSearch(methods, name, signature);
      if (index != -1) {
        throw new DebuggerException("binary search bug: should have found entry " + index);
      }
    }
    return null;
  }

Но оно тут просто сравнивает адреса сигнатур, т.е. это не то. Я пробовал искать алгоритмы для поиска перегруженного метода, там участвует целочисленная переменная distance. И по ней затем просто определяют насколько метод близок.

foror ★★★★★
() автор топика
Последнее исправление: foror (всего исправлений: 2)

Похоже нашел, то что искал com.sun.beans.finder.MethodFinder Без всякой магии, тупой перебор (

foror ★★★★★
() автор топика
Последнее исправление: foror (всего исправлений: 1)
Ответ на: комментарий от foror

А что ты ждал? Эта процедура делается 1 раз при компиляции. Перегруженных методов — ну пусть 10 будет, хотя я даже такого не припомню. Зачем тут какая-то магия?

Если ты мультиметоды хочешь сделать и в рантайме такое пытаешься провернуть — для заданного кортежа типов кешируй метод и всё, этого хватит. Не нашёл в кеше — перебором ищи нужный метод и кидай в кеш.

Legioner ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.