1. В условный оператор переключения можно добавлять строки. Метод заключается в использовании значения hashcode() строки для получения реального значения.
2. Добавлена базовая система, которую можно использовать в литералах, двоичную, путем добавления «0b» или «0B» перед числом.
3. Используйте символы подчеркивания в числовых литералах для разделения чисел для облегчения чтения, не влияя при этом на размер значения. Основной принцип заключается в том, что подчеркивания могут появляться только в том случае, если до и после них стоят цифры.
В версии 4.java7 в исключениях внесены два изменения:
4.1. Поддерживает одновременный перехват нескольких исключений в предложении catch, а второй — сделать тип исключения более точным при перехвате и повторном генерировании исключений. Метод addSuppressed был добавлен в класс Throwable в Java 7. При возникновении исключения другие исключения могут быть подавлены из-за этого исключения и, следовательно, не могут быть созданы обычным образом. В настоящее время вы можете записать эти подавленные методы с помощью метода addSuppressed. Подавленные исключения появятся в информации о стеке выброшенных исключений. Вы также можете получить эти исключения с помощью метода getSuppressed. Преимущество этого в том, что никакие исключения не будут потеряны, что упрощает тестирование разработчикам.
Java7 улучшает синтаксис предложения catch, позволяя указывать в нем несколько исключений. Каждый тип исключения отделяется знаком «|». Следует отметить, что исключения, перехваченные в предложении catch, не могут иметь повторяющиеся типы, а также не допускается, чтобы одно из исключений было подклассом другого параметра исключения, в противном случае произойдет ошибка компиляции (от маленького к верхнему регистру, проблем нет). ). Если в предложении catch объявлено несколько исключений, конкретный тип параметра исключения является минимальной верхней границей всех этих типов исключений.
4.2 Используйте try (приложение-ресурс) {бизнес-обработку} для автоматического освобождения ресурсов. Ресурсы, которыми можно управлять с помощью операторов try, должны соответствовать одному условию, то есть их класс Java должен реализовывать интерфейс java.lang.AutoCloseable, в противном случае произойдет ошибка компиляции. произойдет. Метод close этого интерфейса будет автоматически вызываться, когда необходимо освободить ресурсы.
5. Оптимизируйте вызовы методов с параметрами переменной длины:
Новая функция, представленная в j2se5.0, позволяет использовать параметры переменной длины в объявлениях методов. Последний формальный параметр метода может быть указан для представления любого количества параметров одного типа. При вызове эти параметры передаются в виде массива. На эти параметры также можно ссылаться как на массивы в теле метода.
6. В Java 7 представлена новая аннотация @SafeVarargs. Если разработчик уверен, что метод, использующий параметры переменной длины, не вызовет аналогичную ситуацию при использовании с универсальным классом, его можно объявить с помощью этой аннотации. Аннотацию @SafeVarargs можно использовать только для методов или конструкторов с переменной длиной параметра, и метод должен быть объявлен статическим или окончательным, иначе произойдет ошибка компиляции. Предпосылкой для аннотации метода @SafeVarargs является то, что разработчик должен гарантировать, что обработка параметров универсального типа при реализации этого метода не вызывает проблем с безопасностью типов.
7.Java поддерживает некоторые языки сценариев в виртуальной машине Java через механизм сценариев. Фактически, менеджер скриптового движка поддерживает три метода поисковой системы, которые дополняются именем, расширением файла и типом MIME. нравиться
7.1 Языковая привязка:
Большим преимуществом API поддержки языка сценариев является то, что он стандартизирует взаимодействие между языком Java и языком сценариев, так что программы, написанные на языке Java, могут выполнять двусторонние вызовы методов и передачу данных с помощью сценариев. Передача данных осуществляется через объекты привязки языка. Так называемый объект привязки языка — это простая хеш-таблица, используемая для хранения и получения данных, которые необходимо совместно использовать. Все данные соответствуют записи в этой хэш-таблице и представляют собой простую пару имя-значение. Интерфейс javax.script.Bingings определяет интерфейс объектов привязки языка, который наследуется от интерфейса java.util.Map. Механизм сценариев может использовать несколько языковых объектов привязки во время выполнения. Разные языки имеют разные возможности привязки объектов. По умолчанию обработчик сценариев предоставляет несколько объектов привязки языка для хранения глобальных объектов, созданных во время выполнения. Класс ScriptEnging предоставляет методы put и get для работы с объектами привязки языка по умолчанию, используемыми специально в обработчике сценариев. Программы могут напрямую использовать этот объект привязки языка по умолчанию или использовать свои собственные объекты привязки языка. Во время выполнения скрипта объект привязки языка можно рассматривать как дополнительную таблицу сопоставления переменных. Имена в объектах привязки языка также учитываются при анализе значений переменных. Глобальные переменные и другой контент, созданный во время выполнения скрипта, появятся в объекте привязки языка. Таким образом, двусторонняя передача данных между Java и языком сценариев завершается.
Например, строка с именем «name» добавляется к объекту привязки языка по умолчанию обработчика сценариев с помощью метода put ScriptEngine, а затем в сценарии напрямую ссылаются на этот объект по имени. Аналогично, глобальную переменную message, созданную в скрипте, можно получить с помощью метода get класса ScriptEnging. Это обеспечивает двустороннюю передачу данных между Java-программами и сценариями. Преобразование типов при передаче данных осуществляет скриптовый движок, а правила преобразования зависят от грамматики конкретного языка.
В большинстве случаев достаточно использовать методы put и get ScriptEnging. Если используются только методы put и get, сам объект привязки языка прозрачен для разработчика. В некоторых случаях необходимо использовать собственный объект привязки языка программы. Например, объект привязки языка содержит собственные уникальные данные программы. Если вы хотите использовать свой собственный объект привязки языка, вы можете вызвать метод creatBingings обработчика сценариев или создать объект javax.script.SimpleBingings и передать его методу eval обработчика сценариев, например:
Объект привязки языка, передаваемый через метод eval, вступает в силу только в текущем вызове eval и не изменяет объект привязки языка по умолчанию движка.
7.2 Контекст выполнения сценария Еще одним важным интерфейсом, связанным с выполнением механизма сценариев, является javax.script.ScriptContext, который содержит соответствующую контекстную информацию во время выполнения механизма сценария. Его можно сравнить с интерфейсом javax.servlet.ServletContext в спецификации сервлета в JavaEE. . Механизм сценариев получает информацию, связанную с выполнением сценария, путем обращения к объекту контекста, а также позволяет разработчикам настраивать поведение механизма сценариев через этот объект. Верхний и нижний объекты в основном содержат следующие три типа информации.
7.2.1 Ввод и вывод Сначала представлена информация о конфигурации, связанная с вводом и выводом сценария, включая объект java.io.Reader, используемый сценарием для чтения входных данных во время выполнения, и объект java.io.Writer, который выводит правильное содержимое и информация об ошибке. По умолчанию ввод и вывод сценария происходят в стандартной консоли. Если вы хотите записать вывод сценария в файл, вы можете использовать следующий код. Перенаправьте вывод сценария в файл с помощью метода setWriter. С помощью методов setReader и setErrorWriter ScriptContext вы можете соответственно установить источник ввода данных при выполнении сценария и место назначения вывода сообщения об ошибке при возникновении ошибки.
7.2.2 Пользовательские свойства
ScriptContext также имеет методы для получения и установки атрибутов, аналогичные методам в ServletContext, а именно setAttribute и getAttribute. Разница в том, что атрибуты в ScriptContext имеют ограниченную область действия. Разница между различными областями заключается в порядке поиска. Каждая область использует соответствующее целое число для представления своего порядка поиска. Чем меньше целое значение, тем выше приоритет в порядке поиска. Свойства в области с более высоким приоритетом скроют свойства с тем же именем в области с более низким приоритетом. Поэтому вам необходимо явно указать область при настройке свойств. При получении атрибутов вы можете выбрать поиск в указанной области или выбрать автоматический поиск на основе приоритета области.
Однако область, включенная в реализацию контекста выполнения сценария, фиксирована. Разработчики не могут свободно определять свою собственную область применения. Список всех доступных областей можно получить с помощью метода getScopes ScriptContext. В SciptContext предопределены две области: область, представленная константой ScriptContext.ENGINE_SCOPE, соответствует текущему обработчику сценариев, а область, представленная ScriptContext.GLOBAL_SCOPE, соответствует всем объектам обработчика сценариев, созданным из одной и той же фабрики обработчика. Первое имеет более высокий приоритет. Например:
7.2.3 Объекты привязки языка
Последний тип информации в контексте выполнения сценария — это объект привязки языка. Объекты привязки языка также соответствуют областям действия. Тот же порядок приоритета области применяется к объектам, привязанным к языку. Этот порядок приоритетов будет влиять на разрешение переменных во время выполнения скрипта. Например:
привязки.put("имя","Мир")
engine.eval("println(name);");
7.3 Составление скриптов:
Языки сценариев обычно интерпретируются и выполняются. Механизму сценариев необходимо проанализировать сценарий перед его выполнением во время выполнения. Вообще говоря, запуск сценария через интерпретацию будет медленнее, чем его запуск после компиляции. Если сценарий необходимо выполнить несколько раз, его можно сначала скомпилировать. Скомпилированный скрипт не требует повторного анализа при выполнении, что может повысить эффективность выполнения. Не все скриптовые движки поддерживают компиляцию скриптов. Если механизм сценариев поддерживает эту функцию, он реализует интерфейс javax.script.Compilable для объявления этого. Пользователи обработчиков сценариев могут воспользоваться этой возможностью для повышения эффективности сценариев, которые необходимо выполнять несколько раз. Механизм сценариев JavaScript, поставляемый с Java SE, поддерживает компиляцию сценариев.
В следующем коде метод компиляции интерфейса Compilable используется для компиляции кода сценария, а результат компиляции представлен javax.script.CompiledScript. Поскольку не все скриптовые движки поддерживают интерфейс Compilable, для оценки здесь необходимо использовать instanceof. В методе run сценарий может быть выполнен с помощью метода eval CompiledScript. В коде сценарий выполняется повторно 100 раз, чтобы проиллюстрировать преимущество производительности скомпилированного сценария при многократном выполнении.
public void run(String scriptText) выдает ScriptException {
Сценарий CompiledScript = компилировать (scriptText);
если (скрипт == ноль) {
возвращаться;
}
для (int я = 0; я <100; я++) {
скрипт.eval();
}
}
7.4 Вызовы методов в скриптах В скриптах наиболее распространенными и практичными являются методы. Некоторые механизмы сценариев позволяют пользователям индивидуально вызывать метод в сценарии. Механизмы сценариев, поддерживающие этот вызов метода, могут реализовать интерфейс javax.script.Invocable. Через интерфейс Invocable вы можете вызывать методы верхнего уровня в скриптах и методы-члены в объектах. Если метод верхнего уровня в скрипте или метод-член объекта реализует интерфейс на Java, вы можете получить объект реализации соответствующего интерфейса Java в скрипте через метод в интерфейсе Invocable. Таким образом, интерфейс можно определить на языке Java и реализовать в сценарии. Другие части программы, использующие интерфейс, не знают, что интерфейс реализован сценарием. Как и интерфейс Compilable, реализация интерфейса Invocable в ScriptEngine также не является обязательной.
Следующий код вызывает метод верхнего уровня в скрипте через ignoreFunction интерфейса Invocable. Параметры во время вызова будут переданы методу в скрипте. Поскольку механизм сценариев JavaScript, поставляемый с JavaSE, реализует интерфейс Invocable, здесь опущено решение о том, реализует ли этот механизм интерфейс Invocalbe. Пример вызова метода верхнего уровня сценария в Java:
//Пример вызова методов-членов объекта скрипта в Java
7.5 Реализация интерфейса Java в скрипте
В некоторых механизмах сценариев интерфейс может быть определен на языке Java, а реализация интерфейса может быть записана в сценарии. Таким образом, другие части программы могут взаимодействовать только с интерфейсом Java и о них не нужно заботиться. как реализован интерфейс. В следующем коде Greet — это интерфейс, определенный на Java, который содержит метод getGreeting. Реализуйте этот интерфейс в скрипте. С помощью метода getInterface вы можете получить объект интерфейса, реализованный скриптом, и вызвать в нем методы.
Поскольку синтаксис языка сценариев прост и гибок, он очень подходит для пользователей, не имеющих опыта программирования или имеющих лишь небольшой опыт. Эти пользователи могут использовать язык сценариев для настройки бизнес-логики и пользовательского интерфейса программы. Язык может повысить удобство использования программы. Достигается лучший баланс между гибкостью и гибкостью. Например, язык сценариев Lua широко используется при разработке игр для настройки внутреннего поведения и пользовательского интерфейса игры.
8. Хотя API отражения обеспечивает гибкость Java-программ, он также требует дополнительных затрат на производительность. Из-за механизма реализации API отражения для одной и той же операции, такой как вызов метода, использование API отражения для его динамической реализации происходит быстрее. чем непосредственное выполнение его в исходном коде. Способ написания кода, вероятно, на один-два порядка медленнее. Благодаря улучшению реализации виртуальной машины Java производительность API отражения значительно улучшилась. Однако этот разрыв в производительности существует объективно. Поэтому в некоторых приложениях с относительно высокими требованиями к производительности API-интерфейсы отражения следует использовать с осторожностью.