Подтвердить что ты не робот

Совместимость файлов JDK 7 с обратной совместимостью с JDK 6

Какие функции JDK 7 (исключая invokedynamic, поскольку он не используется java), вызывая версию нового класса, которая не соответствует JDK 6. Это означает, что все функции могут быть реализованы компилятором, генерирующим коды клей. Например, оператор String в switch может быть реализован с использованием повторяющихся операторов ifeq, сгенерированных компилятором. Я хочу дать компилятору -source 1.6 -target 1.6 флаги для совместимости с jre 6 и в то же время использовать возможности монеты проекта в jdk 7.

4b9b3361

Ответ 1

Я не читал код для компилятора, но некоторые из новых функций, очевидно, должны влиять на байт-код.

"Упрощенный вызов метода varargs" на самом деле является просто предупреждением, но он должен оставить некоторый маркер в байт-коде, чтобы клиентский код мог отображать предупреждения по-разному.

"Try-with-resources" генерирует код, который может обрабатывать нормальное исключение, а также второе исключение, созданное во время блока finally. Дополнительное исключение сохраняется с помощью нового метода addSuppressed(). Это не совсем изменение формата файла класса, но оно явно не работает на более ранних виртуальных машинах.

"Multi-catch" также создает байт-код, который тонко отличается от любого предыдущего компилятора. Несколько записей в таблице исключений теперь указывают на одно и то же тело catch.

Ответ 2

Итак, позвольте мне убедиться, что я это понимаю. Вы хотите запустить определенный класс в своем приложении против другого JRE, а затем всех ваших других классов? Я полагаю, это теоретически возможно, если при каждом использовании класса, который вы не хотите использовать в другой версии, вы создаете отдельную JVM. Это будет связано с уровнем сложности, который эквивалентен передаче информации между двумя JVM в непересекающихся приложениях. Из коробки это не работает, потому что среда выполнения в 6 не будет знать о возможностях монеты проекта. IIRC вы не можете использовать generics в 1.4 runtime, так как это отличается? В конце концов, это действительно не стоит того, и, возможно, я полностью пропустил вашу мысль.