Обратная совместимость файла класса JDK 7 с JDK 6 - PullRequest
28 голосов
/ 15 июля 2011

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

Ответы [ 2 ]

8 голосов
/ 01 октября 2011

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

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

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

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

0 голосов
/ 15 июля 2011

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

...