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




推荐阅读
  • 在处理遗留数据库的映射时,反向工程是一个重要的初始步骤。由于实体模式已经在数据库系统中存在,Hibernate 提供了自动化工具来简化这一过程,帮助开发人员快速生成持久化类和映射文件。通过反向工程,可以显著提高开发效率并减少手动配置的错误。此外,该工具还支持对现有数据库结构进行分析,自动生成符合 Hibernate 规范的配置文件,从而加速项目的启动和开发周期。 ... [详细]
  • Netty框架中运用Protobuf实现高效通信协议
    在Netty框架中,通过引入Protobuf来实现高效的通信协议。为了使用Protobuf,需要先准备好环境,包括下载并安装Protobuf的代码生成器`protoc`以及相应的源码包。具体资源可从官方下载页面获取,确保版本兼容性以充分发挥其性能优势。此外,配置好开发环境后,可以通过定义`.proto`文件来自动生成Java类,从而简化数据序列化和反序列化的操作,提高通信效率。 ... [详细]
  • Maven Web项目创建时JSP文件常见错误及解决方案
    Maven Web项目创建时JSP文件常见错误及解决方案 ... [详细]
  • MATLAB字典学习工具箱SPAMS:稀疏与字典学习的详细介绍、配置及应用实例
    SPAMS(Sparse Modeling Software)是一个强大的开源优化工具箱,专为解决多种稀疏估计问题而设计。该工具箱基于MATLAB,提供了丰富的算法和函数,适用于字典学习、信号处理和机器学习等领域。本文将详细介绍SPAMS的配置方法、核心功能及其在实际应用中的典型案例,帮助用户更好地理解和使用这一工具箱。 ... [详细]
  • Android中将独立SO库封装进JAR包并实现SO库的加载与调用
    在Android开发中,将独立的SO库封装进JAR包并实现其加载与调用是一个常见的需求。本文详细介绍了如何将SO库嵌入到JAR包中,并确保在外部应用调用该JAR包时能够正确加载和使用这些SO库。通过这种方式,开发者可以更方便地管理和分发包含原生代码的库文件,提高开发效率和代码复用性。文章还探讨了常见的问题及其解决方案,帮助开发者避免在实际应用中遇到的坑。 ... [详细]
  • CentOS 7环境下Jenkins的安装与前后端应用部署详解
    CentOS 7环境下Jenkins的安装与前后端应用部署详解 ... [详细]
  • 在尝试为 Unity 编译一个简单的 Java 库时,运行 `ant jar` 命令后遇到了 Java I/O 异常。具体错误信息为“无法启动程序 ${aAPT},错误代码 2”,这通常表示指定的文件或目录不存在。此问题可能是由于环境配置不正确或路径设置有误导致的。建议检查相关路径和环境变量,确保所有依赖项都已正确安装和配置。 ... [详细]
  • 本文将带你快速了解 SpringMVC 框架的基本使用方法,通过实现一个简单的 Controller 并在浏览器中访问,展示 SpringMVC 的强大与简便。 ... [详细]
  • oracle c3p0 dword 60,web_day10 dbcp c3p0 dbutils
    createdatabasemydbcharactersetutf8;alertdatabasemydbcharactersetutf8;1.自定义连接池为了不去经常创建连接和释放 ... [详细]
  • 为了在Hadoop 2.7.2中实现对Snappy压缩和解压功能的原生支持,本文详细介绍了如何重新编译Hadoop源代码,并优化其Native编译过程。通过这一优化,可以显著提升数据处理的效率和性能。此外,还探讨了编译过程中可能遇到的问题及其解决方案,为用户提供了一套完整的操作指南。 ... [详细]
  • Java中不同类型的常量池(字符串常量池、Class常量池和运行时常量池)的对比与关联分析
    在研究Java虚拟机的过程中,笔者发现存在多种类型的常量池,包括字符串常量池、Class常量池和运行时常量池。通过查阅CSDN、博客园等相关资料,对这些常量池的特性、用途及其相互关系进行了详细探讨。本文将深入分析这三种常量池的差异与联系,帮助读者更好地理解Java虚拟机的内部机制。 ... [详细]
  • 今天我开始学习Flutter,并在Android Studio 3.5.3中创建了一个新的Flutter项目。然而,在首次尝试运行时遇到了问题,Gradle任务 `assembleDebug` 执行失败,退出状态码为1。经过初步排查,发现可能是由于依赖项配置不当或Gradle版本不兼容导致的。为了解决这个问题,我计划检查项目的 `build.gradle` 文件,确保所有依赖项和插件版本都符合要求,并尝试更新Gradle版本。此外,还将验证环境变量配置是否正确,以确保开发环境的稳定性。 ... [详细]
  • Java测试服务器调试指南详细介绍了如何进行远程调试,并深入解析了Java Xdebug参数的使用方法。本文首先概述了Java内置的调试功能,重点介绍了JDB这一类似于GDB的强大调试工具。通过实例演示,读者可以掌握在测试环境中高效调试Java应用程序的技巧,包括配置远程调试环境和优化调试参数,以提高开发效率和代码质量。 ... [详细]
  • 本文详细介绍了如何在Java Web服务器上部署音视频服务,并提供了完整的验证流程。以AnyChat为例,这是一款跨平台的音视频解决方案,广泛应用于需要实时音视频交互的项目中。通过具体的部署步骤和测试方法,确保了音视频服务的稳定性和可靠性。 ... [详细]
  • Spring框架的核心组件与架构解析 ... [详细]
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社区 版权所有