Метод Заказать в файле сгенерированного файла javac

С JDK7 API отражения изменился, и теперь методы, возвращаемые getDeclaredMethods(), не возвращаются в том порядке, в котором они объявлены в исходном файле.

Теперь мой вопрос заключается в том, содержит ли файл .class, созданный javac, методы в том же порядке, в котором они были определены в исходном файле, или он может также писать методы в случайном порядке?

Ответ 1

В главе Binary Compatibility of the Java Language Specification указано, что переупорядочение элементов в файлах классов разрешено:

[...] вот список некоторых важных двоичных совместимых изменений, которые поддерживает язык программирования Java:

  • [...]

  • Переупорядочение полей, методов или конструкторов в объявлении существующего типа.

  • [...]

  • Переупорядочение списка прямых суперинтерфейсов класса или интерфейса.

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

Ответ 2

API Class.getDeclaredMethods ясно говорит об этом "... Элементы возвращаемого массива не отсортированы и не находятся в каком-либо конкретном порядке...". Скорее всего, причина этого в том, что javac не обязан генерировать методы в .class в любом конкретном порядке.