JEP 330 - запуск однофайловых программ с исходным кодом - одна из самых интересных функций в предстоящем выпуске JDK 11 (18.9). Эта функция позволяет выполнять исходный код Java напрямую с помощью интерпретатора Java. Исходный код компилируется в памяти, а затем исполняется интерпретатором. Ограничение состоит в том, что все классы должны быть определены в одном файле.
Эта функция особенно полезна для тех, кто начинает изучать Java и хочет попробовать простые программы. Эта функция, наряду с jshell, станет отличным набором инструментов для любого новичка в изучении языка. Не только начинающие выиграют. Профессионалы также могут использовать эти инструменты для изучения новых языковых изменений или опробовать неизвестный API.
В этом посте я не буду вдаваться в подробности того, как реализована эта функция. Вместо этого я сосредоточусь на использовании этой функции, пробуя разные образцы. Начнем с самого простого, как обычно, примера: «Привет, мир!»
приведенный ниже код сохранен в файле HelloWorld.java.
public class HelloWorld{
public static void main(String[] args){
System.out.println("Hello World!!!");
}
}
Я выполню приведенный выше код, как показано ниже.
F: \ java11 \ single-file> java HelloWorld.java
Hello World!!!
В приведенном выше примере есть только один класс, и он содержит метод main. При выполнении кода с использованием Java, мы должны передать ему имя файла, заканчивающееся расширением .java. Если имя файла не заканчивается расширением .java, тогда мы должны использовать опцию --source. Мы увидим это в следующем примере.
Параметры командной строки
Средство запуска Java представило новый режим исходного файла для поддержки этой функции. Режим исходного файла включается, если выполняется одно из следующих двух условий:
1. Первым элементом в командной строке, за которым следуют параметры JVM, является имя файла с расширением .java.
2. Командная строка содержит параметр –source version.
Если файл не соответствует стандартным соглашениям об именах для исходных файлов Java, нам нужно использовать параметр –source. Подробнее о таких файлах мы поговорим в следующем разделе.
Все аргументы, помещенные после имени исходного файла в исходной командной строке, передаются скомпилированному классу при его выполнении.
Например, у нас есть файл с именем Addition.java, который содержит класс Addition. Этот класс содержит метод main()
, который вычисляет сумму его аргументов:
java Addition.java 1 2 3
Файлы Шебанга
В системах на основе Unix, таких как macOS и Linux, часто используется директива «#!» Для запуска исполняемого файла сценария.
Например, скрипт оболочки обычно начинается с:
#!/bin/sh
Затем мы можем выполнить скрипт:
$ ./some_script
Такие файлы называются «файлами Шебанга».
Теперь мы можем выполнять однофайловые Java-программы, используя тот же механизм.
Если добавить в начало файла следующее:
#!/path/to/java --source version
Например, давайте добавим следующий код в файл с именем add:
! / Usr / local / bin / java --source 11
import java.util.Arrays;
public class Addition
{
public static void main(String[] args) {
Integer sum = Arrays.stream(args)
.mapToInt(Integer::parseInt)
.sum();
System.out.println(sum);
}
}
И пометить файл как исполняемый:
$ chmod +x add
Затем мы можем выполнить файл как скрипт:
$ ./add 1 2 3
Мы также можем явно использовать панель запуска для вызова файла shebang:
java --source 11 add 1 2 3
Опция –source обязательна, даже если она уже присутствует в файле. Шебанг в файле игнорируется и рассматривается как обычный файл Java без расширения .java.
Несколько классов в одном файле
Как я упоминал ранее, эта функция поддерживает запуск кода, который находится в одном файле. Нет ограничений на количество классов в файле. Давайте рассмотрим пример кода, который содержит два класса:
Вы можете взять любое имя исходного файла Java Sharma.java
public class Test1{
public static void main(String[] args){
System.out.println("Hello " + Test2.print());
}
}
public class Test2 {
public static String print() {
return "Java";
}
}
D:\WorkShop-jdk11\VarInference\src\varmodule\varpack>java .\Sharma.java
Hello Java