热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

JShell和Shebang

JShell从字面理解,即JavaShell,Java的一个交互式终端界面,正式的称呼为REPL(Read-eval-print-loop)交互式的解释器。Shebang#!组合符

今天我们从简单而好玩,容易上手的特性开始。


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在文件解释执行方面的新优功能归纳,相对比较简单,我也不深入探寻相应的实现原理了,希望对大家有所启发。




推荐阅读
  • Question该提问来源于开源项目:react-native-device-info/react-native-device-info ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • 开发笔记:spring boot项目打成war包部署到服务器的步骤与注意事项
    本文介绍了将spring boot项目打成war包并部署到服务器的步骤与注意事项。通过本文的学习,读者可以了解到如何将spring boot项目打包成war包,并成功地部署到服务器上。 ... [详细]
  • 使用Spring AOP实现切面编程的步骤和注意事项
    本文介绍了使用Spring AOP实现切面编程的步骤和注意事项。首先解释了@EnableAspectJAutoProxy、@Aspect、@Pointcut等注解的作用,并介绍了实现AOP功能的方法。然后详细介绍了创建切面、编写测试代码的过程,并展示了测试结果。接着讲解了关于环绕通知的使用方法,并修改了FirstTangent类以添加环绕通知方法。最后介绍了利用AOP拦截注解的方法,只需修改全局切入点即可实现。使用Spring AOP进行切面编程可以方便地实现对代码的增强和拦截。 ... [详细]
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 本文介绍了使用数据库管理员用户执行onstat -l命令来监控GBase8s数据库的物理日志和逻辑日志的使用情况,并强调了对已使用的逻辑日志是否及时备份的重要性。同时提供了监控方法和注意事项。 ... [详细]
  • OpenMap教程4 – 图层概述
    本文介绍了OpenMap教程4中关于地图图层的内容,包括将ShapeLayer添加到MapBean中的方法,OpenMap支持的图层类型以及使用BufferedLayer创建图像的MapBean。此外,还介绍了Layer背景标志的作用和OMGraphicHandlerLayer的基础层类。 ... [详细]
  • Jboss的EJB部署描述符standardjaws.xml配置步骤详解
    本文详细介绍了Jboss的EJB部署描述符standardjaws.xml的配置步骤,包括映射CMP实体EJB、数据源连接池的获取以及数据库配置等内容。 ... [详细]
  • 本文介绍了解决java开源项目apache commons email简单使用报错的方法,包括使用正确的JAR包和正确的代码配置,以及相关参数的设置。详细介绍了如何使用apache commons email发送邮件。 ... [详细]
  • 使用freemaker生成Java代码的步骤及示例代码
    本文介绍了使用freemaker这个jar包生成Java代码的步骤,通过提前编辑好的模板,可以避免写重复代码。首先需要在springboot的pom.xml文件中加入freemaker的依赖包。然后编写模板,定义要生成的Java类的属性和方法。最后编写生成代码的类,通过加载模板文件和数据模型,生成Java代码文件。本文提供了示例代码,并展示了文件目录结构。 ... [详细]
author-avatar
邱walz_297
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有