在JDK 11中启动单文件源代码程序

JEP 330 –启动单文件源代码程序是即将发布的JDK 11(18.9)发行版中令人兴奋的功能之一。 此功能允许直接使用java解释器执行Java源代码。 源代码在内存中编译,然后由解释器执行。 限制是必须在同一文件中定义所有类。

对于刚开始学习Java并想尝试简单程序的人来说,此功能特别有用。 该功能与jshell将是任何初学者学习该语言的绝佳工具集。 不仅它们,而且专业人员也可以使用这些工具来探索新的语言更改或尝试未知的API。

在本文中,我将不详细介绍如何实现此功能,而是将通过尝试不同的示例来专注于使用此功能。 让我们从最简单的示例开始,像往常一样,Hello World!

最简单的例子

下面的代码保存在文件HelloWorld.java

public class HelloWorld{public static void main(String[] args){System.out.println("Hello World!!!");}
}

我将运行上面的代码,如下所示:

PS G:\samples\java11\single-file> java HelloWorld.java
Hello World!!!

在上面的示例中,只有一个类,并且包含main方法。 使用java执行代码时,我们需要将以.java扩展名结尾的文件的名称传递给它。 如果文件名不以.java扩展名结尾,那么我们必须使用--source选项,如我们在下一个示例中看到的那样。

带有命令行参数

让我们增强Hello Worl程序,为每个人创建个性化的问候:

public class Greeting{public static void main(String[] args){if ( args == null || args.length < 1 ){System.err.println("Name required");System.exit(1);}System.out.println(String.format("Hello %s!!", args[0]));}
}

让我们将上面的代码存储在名为HelloGreeting.java的文件中。 请注意,文件名与公共类的名称不匹配。 让我们使用以下代码运行上面的代码:

PS G:\samples\java11\single-file> java HelloGreeting.Java sana
Hello sana!!

在要执行的文件名之后提供给代码的任何参数。 让我们将HelloGreeting.java重命名为greeting然后尝试使用相同的方法执行:

PS G:\samples\java11\single-file> java greeting sana
Error: Could not find or load main class greeting
Caused by: java.lang.ClassNotFoundException: greeting

您可以看到,在没有.java的情况下,解释器正在通过提供的名称作为参数来搜索编译的类。 在这种情况下,我们需要使用--source选项,如下所示:

PS G:\samples\java11\single-file> java --source 11 greeting sana
Hello sana!!

让我向您展示当使用--source选项时,为JDK 10编写的代码如何不适用于JDK 9:

public class Java10Compatible{public static void main(String[] args){var message = "Hello world";System.out.println(message);}
}

让我们对JDK 10和JDK 9执行以上操作,如下所示:

PS G:\samples\java11\single-file> java --source 10 Java10Compatible.java
Hello world
PS G:\samples\java11\single-file> java --source 9 Java10Compatible.java
.\Java10Compatible.java:3: error: cannot find symbolvar message = "Hello world";^symbol:   class varlocation: class Java10Compatible
1 error
error: compilation failed

单个文件中包含多个类

如前所述,此功能支持驻留在单个文件中的运行代码,因此文件中的类数没有限制。 让我们看一个包含两个类的示例代码:

public class SimpleInterest{public static void main(String[] args){if ( args == null || args.length < 3 ){System.err.println("Three arguments required: principal, rate, period");System.exit(1);}int principal = Integer.parseInt(args[0]);int rate = Integer.parseInt(args[1]);int period = Integer.parseInt(args[2]);double interest = Maths.simpleInterest(principal, rate, period);System.out.print("Simple Interest is: " + interest);}
}public class Maths{public static double simpleInterest(int principal, int rate, int period){return ( principal * rate * period * 1.0 ) / 100;}
}

让我们运行这个:

PS G:\samples\java11\single-file> java .\SimpleInterest.java 1000 2 10
Simple Interest is: 200.0

对于定义了多个类的文件,第一类应包含main方法,并且在内存中编译后的解释器将使用第一类来启动执行。

使用模块

使用选项--add-modules=ALL-DEFAULT在内存中编译的代码作为未命名模块的一部分运行。 这使代码可以使用不同的模块,而无需使用module-info.java显式声明依赖关系。

让我们看一下使用新的HTTP客户端API进行HTTP调用的代码。 这些在Java 9中作为孵化器功能引入的API已从孵化器移至java.net.http模块。 示例代码为:

import java.net.http.*;
import java.net.http.HttpResponse.BodyHandlers;
import java.net.*;
import java.io.IOException;public class ExternalModuleDepSample{public static void main(String[] args) throws Exception{HttpClient client = HttpClient.newBuilder().build();HttpRequest request = HttpRequest.newBuilder().GET().uri(URI.create("https://reqres.in/api/users")).build();HttpResponse<String> response = client.send(request, BodyHandlers.ofString());System.out.println(response.statusCode());System.out.println(response.body());     }
}

我们可以通过发出以下命令来运行以上代码:

PS G:\samples\java11\single-file>java ExternalModuleDepSample.java
200
{"page":1,"per_page":3,"total":12,"total_pages":4,
"data":[{"id":1,"first_name":"George","last_name":"Bluth",
"avatar":"https://s3.amazonaws.com/uifaces/faces/twitter/calebogden/128.jpg"},
{"id":2,"first_name":"Janet","last_name":"Weaver",
"avatar":"https://s3.amazonaws.com/uifaces/faces/twitter/josephstein/128.jpg"},
{"id":3,"first_name":"Emma","last_name":"Wong",
"avatar":"https://s3.amazonaws.com/uifaces/faces/twitter/olegpogodaev/128.jpg"}]}

这使我们能够快速测试不同模块中的新功能,而无需创建模块, module-info文件等。

Shebang文件

在本节中,我们将研究创建shebang文件。 Shebang文件是通过使用语法#!/path/to/executable作为#!/path/to/executable的第一行提供执行程序,可以直接在Unix系统上执行的那些文件。

让我们创建一个shebang文件:

#!/g/jdk-11/bin/java --source 11public class SimpleInterest{public static void main(String[] args){if ( args == null || args.length < 3 ){System.err.println("Three arguments required: principal, rate, period");System.exit(1);}int principal = Integer.parseInt(args[0]);int rate = Integer.parseInt(args[1]);int period = Integer.parseInt(args[2]);double interest = Maths.simpleInterest(principal, rate, period);System.out.print("Simple Interest is: " + interest);}
}public class Maths{public static double simpleInterest(int principal, int rate, int period){if ( rate > 100 ){System.err.println("Rate of interest should be <= 100. But given values is " + rate);System.exit(1);}return ( principal * rate * period * 1.0 ) / 100;}
}

如果文件名不遵循标准的Java文件名命名约定,则使用shebang中的source选项。 在我们的例子中,我们将上面的代码保存在一个名为simpleInterest的文件中,可以这样运行:

sanaulla@Sana-Laptop  /g/samples/java11/single-file (master)
$ ./simpleInterest 1000 20 2
Simple Interest is: 400.0

在Windows机器上,我使用了git安装随附的bash shell。 还有其他多种方式,例如Cygwin,Windows 10 Ubuntu支持等。

源代码可以在这里找到。

翻译自: https://www.javacodegeeks.com/2018/07/single-file-source-code-programs-jdk-11.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/348369.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

oracle元字符,正则表达式元字符

[more]1、正则表达式中的元字符元字符 意思 例子说明要匹配的字符是一个特殊字符、常量或者后者引用。(后引用重复上一次的匹配) n 匹配换行符匹配( 匹配 () 匹配 )^ 匹配字符串的开头位置 如果A是字符串的第一个字符&#xff0c;^A 匹配 A$ 匹配字符串的末尾位置 如果B是字符串…

Packt和Java Code Geeks提供的$ 5 Java编程书籍!

您好极客&#xff01; 今天&#xff0c;我们为您带来一些激动人心的消息&#xff01; Java Code Geeks和Packt联手为您提供广泛的书籍库每周折扣。 对于开发人员来说&#xff0c;Java仍然是最强大的选择之一&#xff0c;它是定义企业和移动设备的语言。 本周&#xff0c;我们…

oracle12c 端口查看,Oracle12c修改端口号

Oracle12c数据库更改端口号修改端口号的整体步骤1.1、查看当前监听的状态1.2、停止监听1.3、修改监听文件的端口号1.4、修改初始化参数local_listener1.5、重启监听器1.6、修改完毕&#xff0c;使用新端口登录测试实践步骤&#xff1a;1、查看当前监听的状态[oraclelocalhost ~…

源码时代php中级项目,0526PHP班中级项目评比圆满落幕

为了充分发掘同学们开发项目的成功经验&#xff0c;全面提升学员的综合素质&#xff0c;锻炼学员的解说与问题处理能力&#xff0c;源代码教育(源码时代)重庆校区进行了PHP就业班的中级项目评比。项目评比分为演讲、质询、点评及投票评分几个环节&#xff0c;每个环节都精彩纷呈…

SpringHibernate4

1.概述 本文将重点介绍如何使用Spring设置Hibernate 4 –我们将研究如何使用Java和XML配置来使用Hibernate 4配置Spring 3。 当然&#xff0c;该过程的某些部分对于Hibernate 3文章是通用的 。 2. Maven 要将Spring Persistence依赖项添加到项目pom.xml中 &#xff0c;请参阅专…

qt linux 添加库文件路径,linux下qt使用第三方库的那些事

开发库查看工具&#xff1a;$sudo apt-get install pkg-config很多时候我们并不知道自己电脑有没有这个库&#xff0c;所以我们可以使用这个工具来查看自己有哪些工具&#xff0c;或者哪些工具没有。同时&#xff0c;qmake是对这个工具配置支持的&#xff0c;所以我们很多时候很…

xp系统上安装linux系统教程,XP系统如何安装fedora linux双系统?WinXP安装fedora linux双系统的方法...

有位朋友因为想在linux中熟悉下hadoop的配置开发环境&#xff0c;所以就开始于WinXP系统中安装fedora linux双系统&#xff0c;可是操作了很久都没成功。这该如何怎么办呢&#xff1f;接下来&#xff0c;小编就给大家介绍WinXP安装fedora linux双系统的具体方法。1.下载Fedora-…

solr 的maven_使用Maven运行Solr

solr 的maven使用Maven运行Solr Solr是一个开源搜索服务器&#xff0c;它是使用Lucene Core的索引和搜索功能构建的&#xff0c;它可以用于使用几乎任何编程语言来实现可扩展的搜索引擎。 尽管Solr具有许多优点&#xff0c;但建立一个开发环境并不是其中之一。 这篇博客文章描…

linux指定内核位置,ARM linux内核启动时几个关键地址

1. 内核启动地址ZTEXTADDR解压代码运行的开始地址。没有物理地址和虚拟地址之分&#xff0c;因为此时MMU处于关闭状态。这个地址不一定时RAM的地址&#xff0c;可以是支持读写寻址的flash等存储中介。Start address of decompressor. heres no point in talking about vi…

pae扩展内存 linux,Linux内核-内存管理-PAE(物理地址扩展)

Intel 通过在处理器上把管脚数从 32 增加到 36&#xff0c;以提高处理器的寻址能力&#xff0c;使其达到 2^3664GB&#xff0c;然而线性地址的位数仍然是 32 位&#xff0c;为此&#xff0c;需引入一种新的分页机制。从pentium pro 处理器开始&#xff0c;intel引入一种叫做 PA…

java嵌入式db_Java DB嵌入式模式

java嵌入式dbJava DB是基于Java编程语言和SQL的关系数据库管理系统。 这是Apache软件基金会的开源Derby项目的Oracle版本。 Java SE 7 SDK中包含Java DB。 Java DB有两个部署选项&#xff1a; Embedded和Network Server 。 这篇文章是关于嵌入式部署或模式的。 1.嵌入式 在嵌…

内存属于linux文件吗,linux下的/dev/shm是什么? 内存 文件系统

linux下的/dev/shm是什么&#xff1f;/dev/shm/是linux下一个目录&#xff0c;/dev/shm目录不在磁盘上&#xff0c;而是在内存里&#xff0c;因此使用linux /dev/shm/的效率非常高&#xff0c;直接写进内存。我们可以通过以下两个脚本来验证linux /dev/shm的性能&#xff1a;[r…

群晖备份linux分区,数据丢失的后悔药,群晖NAS备份方案详解

“秒速开机”——据说90%的人都是因为这句话而知道的SSD固态硬盘。相比于机械硬盘&#xff0c;SSD固态硬盘开机快、关机快、打开软件快、载入数据快、拷贝快、删除也快——既快乐、又爽快&#xff0c;更是大块人心!然而&#xff0c;SSD固态硬盘已经可以完全取代机械硬盘了吗&am…

php cdi_异步CDI事件

php cdi几天前&#xff0c;在我们的常规代码审查中&#xff0c;我的一位同事提出了一个问题&#xff0c;即如果可能&#xff0c;一次同时调用CDI观察者&#xff08;这样的方法带有参数Observes &#xff09;将发生多次&#xff1f;用于不同的事件实例。 换句话说&#xff0c;在…

tg3269c网卡驱动linux,TP-Link3269C网卡驱动官方版

TG-3269C驱动是一款能够安装于由普联发布的无线网卡驱动&#xff0c;通过此安装驱动我们手机和其他无线设备才能连接上无线网卡并进行上网&#xff0c;同时如果你的网卡经常出现断开和重连、网络不稳定等情况可以通过重新安装驱动&#xff0c;查看是否是硬件的问题&#xff0c;…

使用Spring Security,Thymeleaf和Okta保护Java应用程序的安全

永不再构建身份验证 –喜欢构建用户管理&#xff1f; 使用Okta&#xff0c;您可以在几分钟内为您的应用程序添加社交登录&#xff0c;多因素身份验证和OpenID Connect支持。 立即创建一个免费的开发者帐户。 在构建Java应用程序时&#xff0c;用户管理是至关重要的考虑因素。 …

红旗linux添加usb无线网卡,在Ubuntu 8.10中安装无线网卡RTL8187SE驱动

本人的笔记本是微星的Wind U90&#xff0c;自带的无线网卡是RTL8187SE。这款无线网卡在一般的Linux下是没有驱动的&#xff0c;微星的官方也仅仅提供在OpenSUSE下的驱动。为了在我的Ubuntu下使用这个网卡&#xff0c;只能自己动手了。还好&#xff0c;有了互联网上各位大侠和微…

java linq_LINQ和Java

java linqLINQ已经非常成功&#xff0c;但在.NET生态系统中也引起了争议。 许多人正在Java世界中寻找可比的解决方案。 为了更好地理解什么是可比的解决方案&#xff0c;让我们看一下LINQ解决的主要问题&#xff1a; 查询语言通常是具有许多关键字的声明性编程语言。 它们提供…

嵌入式 linux restful,嵌入式 RESTful 框架 express.java

软件介绍express.java 是一个微型的 RESTful Web 框架。可用于嵌入应用内部&#xff0c;替代 JMX 用于跨语言通讯。示例代码&#xff1a;WebServer.jettyServer().get("/", new AjaxController() {Overridepublic Object ajax(ParamMap params) {return ResultMap.cr…

将Google reCaptcha与Spring Boot应用程序结合使用

介绍 Google的reCaptcha是一个用于防止漫游器向您的公共表单提交数据或访问您的公共数据的库。 在本文中&#xff0c;我们将研究如何将reCaptcha与基于Spring Boot的Web应用程序集成 设置验证码 您应该从管理面板创建API密钥。 您必须创建一个示例应用程序&#xff0c;如下所…