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

jdk12源代码文件

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

jdk12源代码文件

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

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

相关文章

java控制图片移动_多线程控制图片移动

帮忙看下为什么图片没有显示 图片目录在src 下的image 文件夹中package com.thread;import java.awt.EventQueue;import javax.swing.ImageIcon;import javax.swing.JFrame;import javax.swing.JLabel;public class SleepDemo extends JFrame implements Runnable {private JLa…

Linux 命令之 cut -- 分割字符串,显示或删除指定字段的内容,合并文件内容

文章目录一、命令介绍二、常用选项三、命令示例根据指定的字节范围显示指定文件中的内容指定字段分隔符&#xff0c;显示指定字段的内容显示指定字段的内容根据指定的字符范围显示指定文件中的内容显示指定字段以外的字段的内容以指定的输出分隔符来分割输出内容中的字段合并多…

java 抛异常 jvm_邪恶的Java技巧使JVM忘记检查异常

java 抛异常 jvm我长期以来一直在批评Java中编译器检查异常的机制。 无论您是爱还是恨&#xff0c;都可以肯定一件事&#xff1a;在某些情况下&#xff0c;您不想与他们打交道。 Java中的解决方案是将一个检查后的异常包装在new RuntimeException(e)但这可以提供较长的堆栈跟踪…

java空文本_输出到文本文件,控制台为空-Java

首先,您必须创建一个从OutputStream接口继承的类以实现适配器模式(我不确定是否是adapter)那么您可以使用该类作为波纹管主要PrintStream finalStream;TreeOutputStream tos;PrintStream out;out new PrintStream("logs.txt");tos new TreeOutputStream();tos.add(…

Linux 组合命令/命令组合的符号

在 EX 命令中&#xff0c;竖直线 | 是命令的分割符&#xff0c;它允许用户把多个命令组合在一起执行Shell 命令使用分号 ; 组合命令

混合多云架构_使用混合多云每个人都应避免的3个陷阱(第4部分)

混合多云架构每天都在肆意宣传云&#xff0c;但每个人都应避免三个陷阱。 从云&#xff0c;混合云到混合多云&#xff0c;您都被告知这是确保业务数字化未来的一种方式。 您必须做出的这些选择不会排除提高客户体验和敏捷交付这些应用程序的日常工作。 让我们开始一段旅程&…

Linux 中常见的较为复杂的命令实例

文章目录 命令 find 和命令 grep 联合使用命令 find 和 命令 convert 联合使用命令 find 和命令 rm 联合使用命令 find 和命令 xargs 联合使用命令 sed 和目录 grep 联合使用命令 find 和命令 grep 联合使用 [root@htlwk0001host test]# find . -name "*.txt" -exec…

mysql 触发器 注意事项_MySQL触发器的利弊-使用MySQL触发器时应该注意的事项

在&#xff2d;ySQL中&#xff0c;触发器可以在你执行INSERT、UPDATE或DELETE的时候&#xff0c;执行一些特定的操作。在创建触发器时&#xff0c;可以指定是在执行SQL语句之前或是之后执行这些操作。通过触发器&#xff0c;你可以实现一些业务逻辑或一些数据限制&#xff0c;在…

混合多云架构_使用混合多云每个人都应避免的3个陷阱(第2部分)

混合多云架构如果您已经完全控制了本地数据中心&#xff0c;但又不能停止利用和支付过多的资源&#xff0c;那么如何期望防止这些成本转嫁到您的云策略中呢&#xff1f; 每天都在肆意宣传云&#xff0c;但每个人都应避免三个陷阱。 从云&#xff0c;混合云到混合多云&#xff0…

Linux 系统中用于在文件内查找指定的字符串的命令 -- grep/egrep/fgrep 的区别详解

文章目录一、命令介绍grepegrepfgrep二、正则表达式元字符扩展集三、POSIX 字符集一、命令介绍 grep 一种强大的文本搜索工具&#xff0c;用于在文件内查找指定的字符串&#xff0c;在不使用转义符的前提下支持基本的正则表达式来搜索文本&#xff0c;并把匹配的行打印出来。…

rest api封装调用_如何从云功能调用外部REST API

rest api封装调用在之前的博客文章中&#xff0c;我展示了如何创建您的第一个云功能 &#xff08;以及一个视频 &#xff09;。 您的云函数很可能需要调用外部REST API。 以下教程将向您展示如何创建此类功能&#xff08;非常简单&#xff09;。 登录到IBM Cloud帐户 点击目录…

SVN 版本控制的数据合并规则

文章目录自己的猜想文件名比对文本行比对事实是什么提交计划提交数据更新客户端版本库数据时&#xff0c;同名文件中文本行的数据比对规则自己的猜想 假设SVN服务端就存在一份最新版的文件 HF&#xff0c;客户端检出这份文件后再提交&#xff0c;当前用户提交的文件称为 NF。 …

java算术运算符的分类_6.Java算术运算符

1.算术运算符的分类:算术运算符:* :( 正数&#xff0c;加法 ,连接符)* 连接符: 如果数据和字符串连接一起就是用了"",那么""就成了连接符,拼接字符串* 任何数据与字符串使用连接符那么结果的数据类型都是字符串类型* 任何数据和数据相加就是做加法…

java项目教训_[免费电子书]分析超过600,000个Java项目的经验教训

java项目教训建立明智的错误处理工作流程需要什么&#xff1f; 调查和解决生产中的应用程序错误对于维持性能和可靠性至关重要。 但是&#xff0c;这并不意味着要花很多时间。 要理解为什么在生产中的故障排除&#xff0c;可这样的头痛&#xff0c;我们开始发现“真理”我们经…

MacOS 的软件包管理工具 MacPorts

MacPorts 就像 Homebrew 一样&#xff0c;可以管理 MacOS 的软件包&#xff0c;和 Linux 系统下的 apt-get、yum 一样。 官方网址&#xff1a;https://www.macports.org/index.php

java plus方法_Java.math.BigDecimal.plus()方法实例

全屏Java.math.BigDecimal.plus()方法实例java.math.BigDecimal.plus() 返回一个BigDecimal&#xff0c;其值是 (this)&#xff0c;并且其刻度为是 this.scale().这种方法&#xff0c;它只是返回此BigDecimal是包括对称性与一元减号方法negate()。声明以下是java.math.BigDecim…

java jdk设置字符集_使用JDK 11在Java字符串上的新方法

java jdk设置字符集Java的String类似乎将在JDK 11中获得一些新方法&#xff0c;该方法将于2018年9月发布。 错误号 错误标题 新的String方法 描述 JDK-8200425 字符串::行 lines() “使用专用的分隔符从源字符串中懒散地提供行的字符串实例方法。” JDK-8200378 Stri…

MacOS 如何安装 SVN 命令终端

I purchased a new Mac running Mac OS X v10.8.5 (Mountain Lion). I’ve seen it written in various places that SVN is installed on OS X by default, but when I open a terminal and type which svn the program is not found. I’ve also run find / -name svn to che…

java代码审计ssrf危险函数_某租车系统Java代码审计之后台注入漏洞分析

CMS简介系统基于租车业务场景而搭建的O2O服务平台&#xff0c;可为用户提供商务租车、接送机、旅游租车、企业租车、自驾租车、婚庆用车等自助租车服务。系统包含车辆库管理、门店管理、员工管理、司机管理、订单管理、活动管理、评价管理、财务管理、统计等。部署简介1、下载代…

docker jib_Jib –为Spring Boot应用程序构建docker映像

docker jib使用Jib为示例Spring Boot应用程序创建docker映像是如此容易&#xff0c;这让我感到惊喜。 让我首先将Jib与以前使用的方法进行对比。 我正在使用bmuschko出色的gradle-docker插件创建docker映像。 如果可以访问docker守护进程以及基于dockerfile或直接Dockerfile的…