Цель состоит в том, чтобы написать код Java, который обнаруживает версию JVM, полагаясь на изменения совместимости, побочные эффекты, ошибки и / или неопределенное поведение, которое работает в одной версии и другим способом в другой версии. Кроме того, код должен быть хотя бы немного читабельным, не жертвуя пробелами и разборчивыми именами переменных.
Для обеспечения этой цели, точные формальные правила:
Код должен быть написан на Java и должен выводить версию JRE, в которой он работает.
Код не должен использовать какой-либо JDK или JRE API, предоставленный специально для определения версии Java или который предоставляет версию JDK или JRE бесплатно.
Код не должен использовать отражение.
Код требуется только для работы в Hotspot Java SE 5, 6 и 7, но может работать и в других JVM.
Код не должен использовать сторонние библиотеки в пути к классам.
Код не должен запускать любой другой процесс, Java или нет.
Код не должен использовать переменные среды.
Код не должен искать файловую систему в поисках уже существующих файлов или папок.
Код должен содержаться в одном файле и вызываться через
public static void main(String[] args)
илиpublic static void main(String... args)
.Код не должен использовать какой-либо непубличный API, присутствующий в JRE.
Код не должен генерировать никаких NoClassDefFoundError, NoSuchMethodError, ClassNotFoundException или NoSuchMethodException во время его выполнения.
Код должен работать в системе, отключенной от Интернета или от любой локальной сети.
Вы должны предоставить объяснение того, почему он ведет себя так или иначе в версии и в другой версии.
счет
Для измерения наилучшего решения используется метод max (n / s), где n - это количество различных версий Java, обнаруженных без нарушения любого из этих правил (по крайней мере, версии 5, 6 и 7), а s - количество лексических токенов. в решении.