今天我们从简单而好玩,容易上手的特性开始。
JShell
JShell从就能字面理解,即Java Shell,Java的一个交互式终端界面,正式的称呼为REPL(Read-eval-print-loop)交互式的解释器。
一般来说,解释性的语言都有REPL界面的,如Python, Ruby,而编译性的语言就没有,比如C,C++。Java语言之前一直也没有,只是基于JVM的语言,如Scala,Groovy都提供REPL。
如今Java程序员大多都是从IDE开始学习的,IDE开发环境自然比REPL Shell提供了强大太多的功能。
但如果没有IDE呢?我还记得我初学计算机时的,中华学习机上Basic语言界面上跳跃的字符,一个儿童的各种遐想能通过一行行语句的输入,和显示的信息得到证实。
没错,使用REPL界面是用来尝试学习一门新语言极好的方式。尽管对于大学生以上的成年人,IDE入门是最有效率的,而对于中小学生,使用JShell这样的REPL界面,来学习一门语言,我个人认为是极有好处的。
应该说比Scratch这样完全图示化语言的更接近实用性,而又比C/C++的简化版IDE更能体会语言的妙处。当然,Python也是初学者一个很好的选择。
JShell是Java9以后加入的,通过jshell命令就可以呼出,非常方便。
通过输入/help命令就可以查询到jshell支持的命令,反馈的结果即时可见,非常有利于调试小型三方库。
我们用一个小例子来说明如何把玩jshell:
mp3agic是一个java编写的mp3文件信息解析库,可以从中央仓库下到jar包,地址为
http://central.maven.org/maven2/com/mpatric/mp3agic/0.9.1/mp3agic-0.9.1.jar
我们使用JDK11 build 26,在启动时需要引入mp3agic的jar包
$ ./java -version
openjdk version "11-ea" 2018-09-25
OpenJDK Runtime Environment 18.9 (build 11-ea+26)
OpenJDK 64-Bit Server VM 18.9 (build 11-ea+26, mixed mode)
$ ./jshell --class-path x1/down/mp3agic-0.9.1.jar
| Welcome to JShell -- Version 11-ea
| For an introduction type: help intro
jshell>
我们使用这个mp3库提供的类来打开一个迈克尔杰克逊的mp3,先导入必要的类
jshell> import static java.lang.System.out
jshell> import com.mpatric.mp3agic.*
jshell> Mp3File mp3 = new Mp3File("/tmp/mj.mp3")
mp3 ==> com.mpatric.mp3agic. Mp3File@370736d9
可以看到打印出一个类实例的正常信息,表示这个mp3已经正常打开了。
jshell> ID3v2 id2v2Tag = mp3.getId3v2Tag()
id2v2Tag ==> com.mpatric.mp3agic. ID3v23Tag@63753b6d
我们获取mp3文件中附带的信息
jshell> out.print(id2v2Tag.getAlbum())
King Of Pop
jshell> out.print(id2v2Tag.getArtist())
Michael Jackson
jshell> out.print(id2v2Tag.getTitle())
Beat It
jshell> out.print(id2v2Tag.getYear())
2010-02-10
以上读出了该mp3文件对应的唱片名称,歌手姓名,歌曲名,以及发行年份。
当然,更多的信息可以进一步读出。如果你想成为歌手,可以这样:
jshell> id3v2Tag.setArtist("张三");
jshell> mp3.save("zhangsan.mp3");
可以设想你可以从网上找到各种三方包,导入并边学边玩。
我计划有空时给孩子整理一个minecraft的程序包,这样在游戏中学习,能编程构建出精妙的建筑,以及创造出别致的工具,是不是很有趣呢?
综上所述,JShell提供一个直接了当使用Java的工具,对于Java开发工程师,提供了一个媲美解释性语言的能力,对于数据分析,系统管理等方面也很有用处。
Shebang
如果说JShell很容易理解的化,Shebang(设?帮?)是个什么鬼?
熟悉Unix的同学都知道"#!"组合符号吧,这个就被成为shebang,其实就是
hash + bang的写法(hashbang -> sha-bang -> shebang)
!叹号(Exclamation mark)在计算机中被称为bang,没错,按照拼音读法就对。(如果你不熟悉bang的顿挫的读法,说明你没有经历过Linux环境下Bash的蹂躏。下面是抢答时间:“#!, $!, !!, !^“分别代表什么意思? 能不查网络全部答对,Linux基本功说明不错)
Shebang #!组合符号,就是告诉bash,这个执行文件可以通过哪个命令来执行,比如说#!/bin/bash, #!/bin/python等。
这样说来,java可以难道自行启动了?
对,从Java11起,普通的java源代码文件可以在设置可执行属性后,可以直接启动:
我们创建一个java文件,叫做helloPengyou,里面是正常的java源代码。
#!/x1/java/jdk-11/bin/java --source 11
public class HelloPengyou {
public static void main(String[] args) {
System.out.println("Hello Peng youquan");
}
}
第一行用shebang告诉shell,使用java程序来启动,并告知为jdk11代码。
需要给helloPengyou赋予可执行属性
$ chmod 0755 simpleInterest
$ ./helloPengyou
Hello Peng youquan
Java圈的朋友们,惊喜不惊喜?
其实这里的原理是,java程序做了一个精简
javac -d Hello.java
java -cp hello
先调用类似javac在内存中进行编译,再用java来解释执行,通过shebang来找到java程序的位置。
所以其实是java直接解释执行java源文件。此处似乎有个bug,我需要把文件名更换一下,以及注释掉shebang定义才能运行成功。
$ mv helloPengyou HelloPengyou.java /并注释第一行
$ /x1/java/jdk-11/bin/java HelloPengyou.java
Hello Pengyouquan
至此,java语言具备了单个文件“解释”执行能力。我们可以设想,同jshell结合起来,开发者可以快速的利用三方库实现小的功能,并执行验证。
以上就是Java在文件解释执行方面的新优功能归纳,相对比较简单,我也不深入探寻相应的实现原理了,希望对大家有所启发。