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源代码文件

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

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

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

  2. python解析sql文件_如何从Python中解析sql文件?

    是否有任何方法可以从Python中执行.SQL文件中的某些SQL命令,而不是文件中的所有SQL命令?假设我有以下.sql文件:DROP TABLE IF EXISTS `tableA`; CREATE ...

  3. matlab分析xml文件_如何在Java中读取XML文件(DOM分析器)

    matlab分析xml文件 Today we will learn how to read the XML file in Java. We will also learn how to parse ...

  4. macos 虚拟镜像文件_如何在macOS中使用虚拟文件测试网络或硬盘速度

    macos 虚拟镜像文件 File transfer speeds can vary greatly from device to device. The same holds true for ne ...

  5. shell运行python文件_在python shell中运行python文件的实现

    在python shell中运行python文件的实现 最近在学习flask开发,写好程序后需要在python shell中运行测试功能.专门抽时间研究了下,总结以防止以后遗忘. 这是测试文件的结构, ...

  6. chrome查看网页文件_如何在Chrome中直接将文件和网页下载到Google云端硬盘

    chrome查看网页文件 We've all downloaded files from the web to our computer. However, if you'd rather downl ...

  7. 手机中geetest是什么文件_安卓手机系统中各类英文文件夹的含义详解,不知道的尽快熟知!...

    说到手机,不管是安卓版还是苹果版的手机,总是会有很多地方让人头疼,不是因为不好用,而是因为不认识,完全不知道干嘛用的.看来使用手机,还需要将自己的英文学好,这样才不会导致自己的手机内存不够用和误删除一 ...

  8. python 读取日志文件_如何在Python中跟踪日志文件?

    使用SH模块(PIP安装sh):from sh import tail# runs foreverfor line in tail("-f", "/var/log/som ...

  9. import引入json文件_在React组件中导入Json文件

    我正在尝试在React组件中加载languages.json文件.当我想导入json文件时,我在第一步收到以下错误.这是错误: ERROR in ./app/languages.json Module ...

最新文章

  1. iframe内联元素有白边原因_Selenium无法定位元素的几种解决方案
  2. 应用内评分_游戏评分低,怎么办?
  3. Python中的高级数据结构详解
  4. 写代码爬取了某 Hub 资源,只为撸这个鉴黄平台!
  5. python机器学习--sklearn数据集使用
  6. php变量作用域(花括号、global、闭包)
  7. Simulink之不可控整流电路
  8. 内网发现,域名解析 mDNS(Arduino实现)
  9. windows下apache建立不同虚拟主机
  10. Oracle数据库学习(二)
  11. python3x程序设计基础周元哲_Python 3 x程序设计基础
  12. 世界是数字的读后感:
  13. python实现递归和非递归求两个数最大公约数、最小公倍数
  14. 同质化代币和非同质化代币 区别对比
  15. 深度学习--十折交叉验证
  16. 微信公众号订阅号与微信服务号有什么不同
  17. web前段 ps基础
  18. 论文笔记 ACL 2017|Exploiting Argument Information to Improve Event Detection via Supervised Attention
  19. 推荐系统——Neural Collaborative Filtering(NMF)
  20. IBM期望通过牺牲连通性以完成量子计算的规模化; QQCI宣布成立QUBT大学 | 全球量子科技与工业快讯第三十二期

热门文章

  1. 数据结构题(莫队算法)
  2. 牛客网【每日一题】5月27日题目精讲 货币系统
  3. 【学习笔记】浅谈广义矩阵乘法——动态DP
  4. YBTOJ洛谷P4551:最长异或路径(trie树)
  5. [2020.10.30NOIP模拟赛]小鱼吃大鱼【RMQ】
  6. 【期望】期望收益(金牌导航 期望-3)
  7. 【暴力】MSWORLD
  8. BZOJ3527: [Zjoi2014]力 [FFT]
  9. 如何快速开发一个 Dubbo 应用
  10. 互联网账户系统如何设计