文档章节

【译】JDK9:像Unix脚本一样执行Java代码

Lofo
 Lofo
发布于 2017/06/01 09:47
字数 648
阅读 112
收藏 4
点赞 0
评论 0

现在你多少听说一些JDK9 JShell相关的内容。如果你没有了解过,查看Oracle博客。这篇文章中将介绍如何使用JShell像Unix脚本一样执行Java代码。

让我们开始一个简单的例子,再进行详细的介绍:

  • 创建一个 java_shell_code.txt 的文件;
  • 在文件中写一些Java代码,并执行以下命令。你没必须声明一个Class,你可以直接写一句代码,或者创建一个方法。
java ex.jshell.extension.JShellScriptExecutor ./java_shell_code.txt

java_shell_code.txt

// java_shell_code.txt contents.

/* If you observe it does not need a class declaration.
 Using the power of jshell, we can write functions and call functions with out creating class, just like functional programming */

 // You can also include comments like above, anywhere in the script

String var1 = "Hello";

System.out.println(var1);


public int getInt1(){

    return 2;

}


public int getInt2(){

    return 4;

}


getInt1() + getInt2();


public class MyClass{

    public void sayHelloWorld(){

        System.out.println("HelloWorld");

    }

}



new MyClass().sayHelloWorld()

执行结果:

"Hello"

Hello

6

HelloWorld

详细介绍

在JDK9中提供了一个新的类 JShell.java,它属于jdk.jshell模块。我们可以使用它执行Java代码片段,或创建一个Java方法,而不用创建一个类。如果这个Java代码片段中有错误,可以通过 Snippet.status状态(只有两种状态:REJECTED、VALID)来检查。SourceCodeAnalysis是用来解析代码的,它使用分号、解析方法、或类的声明等。

下面是JShellScriptExecutor代码。你可以拷贝,并修改它。你也可以从GitHub仓库中克隆。

package ex.jshell.extension;
import jdk.jshell.JShell;
import jdk.jshell.Snippet;
import jdk.jshell.SnippetEvent;
import jdk.jshell.SourceCodeAnalysis;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Objects;
/**
 * This class can execute jshell expressions in sequence
 * We can write java commands like shell script and execute it.
 * Just write commands in a way that we give in jshell and save it in a file and execute it.
 *
 * @author Hemamabara Vamsi, Kotari
 * @since 5/27/2017.
 */
public class JShellScriptExecutor {
    public static void main(String[] args){
        new JShellScriptExecutor().evaluate(args[0]);
    }
    public void evaluate(String scriptFileName){
        try(JShell jshell = JShell.create()){
          // Handle snippet events. We can print value or take action if evaluation failed.
            jshell.onSnippetEvent(snippetEvent -> snippetEventHandler(snippetEvent));
            String scriptContent = new String(Files.readAllBytes(Paths.get(scriptFileName)));
            String s = scriptContent;
            while (true) {
                // Read source line by line till semicolon (;)
                SourceCodeAnalysis.CompletionInfo an = jshell.sourceCodeAnalysis().analyzeCompletion(s);
                if (!an.completeness().isComplete()) {
                    break;
                }
                // If there are any method declaration or class declaration 
                // in new lines, resolve it.
                jshell.eval(trimNewlines(an.source()));
                // EOF
                if (an.remaining().isEmpty()) {
                    break;
                }
                // If there is semicolon, execute next seq
                s = an.remaining();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public void snippetEventHandler(SnippetEvent snippetEvent){
        String value = snippetEvent.value();
        if(!Objects.isNull(value) && value.trim().length() > 0) {
          // Prints output of code evaluation
            System.out.println(value);
        }
        // If there are any erros print and exit
        if(Snippet.Status.REJECTED.equals(snippetEvent.status())){
            System.out.println("Evaluation failed : "+snippetEvent.snippet().toString()
                                +"\nIgnoring execution of above script");
        }
    }
    private String trimNewlines(String s) {
        int b = 0;
        while (b < s.length() && s.charAt(b) == '\n') {
            ++b;
        }
        int e = s.length() -1;
        while (e >= 0 && s.charAt(e) == '\n') {
            --e;
        }
        return s.substring(b, e + 1);
    }
}

module-info.java

module ex.jshell.extension{   
  requires jdk.jshell;
}

赶快试用下强大的JShell吧。

原谅链接:https://dzone.com/articles/jdk9-execute-java-code-like-unix-shell-script?edition=304109&utm_source=Daily%20Digest&utm_medium=email&utm_campaign=dd%202017-05-31](https://dzone.com/articles/jdk9-execute-java-code-like-unix-shell-script?edition=304109&utm_source=Daily%20Digest&utm_medium=email&utm_campaign=dd%202017-05-31)

© 著作权归作者所有

共有 人打赏支持
Lofo
粉丝 13
博文 64
码字总数 17024
作品 0
长宁
高级程序员
《字符串连接你用+还是用StringBuilder》续

前言 前面的一篇文章《字符串连接你用+还是用StringBuilder》,有朋友找我反馈了一些问题,其中一位朋友说JDK10下生成的字节码跟文章中并不一样,这里继续看下是什么情况。 问题描述 如下图,...

超人汪小建
07/16
0
0
升级到JDK9的一个BUG,你了解吗

概述 前几天在一个群里看到一个朋友发了一个demo,说是JDK的bug,昨天在JVM的一个群里又有朋友发了,觉得挺有意思,分享给大家,希望大家升级JDK的版本的时候注意下是否存在这样的代码,如果...

你假笨
06/06
0
0
JDK9 学习之二 - Jshell(java 函数变成交互式 shell)

Jshell介绍 ------谁说原生java不能函数式编成! JShell(JAVA Shell tool)是用来学习java语言和代码设计的一个交互式工具。JShell是一个Read-Evaluate-Print Loop (REPL)阅读-键入-打印-循...

_Leo_
2017/10/18
0
3
第一章:groovy 的语法和用法习惯

我们将介绍 groovy 语言的基础知识, 使用 groovy 需要知道的两件事:代码外观和断言。 我是看着Groovy in Action的时候,写这个博客的。所以很多东西是从里面复制出来的,希望大家去看原书。...

supperman
2012/11/16
0
0
scala入门之编写scala脚本

尽管scala的设计目的是帮助程序员建造大型系统。但它也能适应于制造小型的脚本。例如把以下代码放在hello.scala文件中: println("Hello,world,form ascript!") 然后运行: scala脚本的命令行...

柳哥
2014/06/05
0
0
手把手教你搭建hadoop+hive测试环境(新手向)

本文由 网易云 发布 作者:唐雕龙 本篇文章仅限内部分享,如需转载,请联系网易获取授权。 面向新手的hadoop+hive学习环境搭建,加对我走过的坑总结,避免大家踩坑。 对于hive相关docker,并...

wangyiyungw
05/10
0
0
Java MongoDB : Save image example

Java MongoDB : Save image example In this tutorial, we show you how to save an image file into MongoDB, via GridFS API. The GridFS APIs are able to serve other binary files as w......

引鸩怼孑
2015/05/22
0
0
三分钟读懂Java与JavaScript的区别,让小白摘帽

Java跟JavaScript虽然在名称上有些许相似,但其实是两种完全不同的语言。Java是一种程序设计语言,JavaScript是客户端的脚本语言,把这两样东西放在一起比较在科学上其实并不严谨。但它们唯一...

小欣妹妹
2017/10/21
0
0
编译 Hadoop2.2.0 的 Eclipse 插件

我的环境: 1.git(下载需要,当然也可以下载压缩包,下载压缩包就不需要git了)2.ant,并配置了环境变量(编译需要)3.jdk1.7_514.centOS6.5325.当前目录/opt6.eclipse主目录:/opt/eclipse,...

hoodlake
2014/04/12
0
0
gradle/Groovy语法

Groovy官网的介绍(http://www.groovy-lang.org/download.html#gvm) Gradle API 文档: https://docs.gradle.org/current/dsl/org.gradle.api.invocation.Gradle.html 深入理解Android(一)......

shareus
04/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

win10 上安装解压版mysql

1.效果 2. 下载MySQL 压缩版 下载地址: https://downloads.mysql.com/archives/community/ 3. 配置 3.1 将下载的文件解压到合适的位置 我最终将myql文件 放在:D:\develop\mysql 最终放的位...

Lucky_Me
14分钟前
1
0
linux服务器修改mtu值优化cpu

一、jumbo frames 相关 1、什么是jumbo frames Jumbo frames 是指比标准Ethernet Frames长的frame,即比1518/1522 bit大的frames,Jumbo frame的大小是每个设备厂商规定的,不属于IEEE标准;...

问题终结者
28分钟前
1
0
expect脚本同步文件expect脚本指定host和要同步的文件 构建文件分发系统批量远程执行命令

expect脚本同步文件 在一台机器上把文件同步到多台机器上 自动同步文件 #!/usr/bin/expectset passwd "123456"spawn rsync -av root@192.168.133.132:/tmp/12.txt /tmp/expect {"yes...

lyy549745
29分钟前
0
0
36.rsync下 日志 screen

10.32/10.33 rsync通过服务同步 10.34 linux系统日志 10.35 screen工具 10.32/10.33 rsync通过服务同步: rsync还可以通过服务的方式同步。那需要开启一个服务,他的架构是cs架构,客户端服务...

王鑫linux
37分钟前
0
0
matplotlib 保存图片时的参数

简单绘图 import matplotlib.pyplot as pltplt.plot(range(10)) 保存为csv格式,放大后依然很清晰 plt.savefig('t1.svg') 普通保存放大后会有点模糊文件大小20多k plt.savefig('t5.p...

阿豪boy
42分钟前
1
0
java 8 复合Lambda 表达式

comparator 比较器复合 //排序Comparator.comparing(Apple::getWeight);List<Apple> list = Stream.of(new Apple(1, "a"), new Apple(2, "b"), new Apple(3, "c")) .collect(......

Canaan_
昨天
0
0
nginx负载均衡

一、nginx 负载均衡 拓扑图: 主机信息: 1、负载均衡器1(lb1):192.168.10.205 RHEL7.5 2、负载均衡器2(lb2):192.168.10.206 RHEL7.5 3、web服务器1(web01):192.168.10.207 Centos...

人在艹木中
昨天
0
0
做了一个小网站

做了一个小网站 www.kanxs123.com

叶落花开
昨天
1
0
继社会佩奇之后,又尝试了可爱的蓝胖子,有趣 Python

#哆啦A梦# !/usr/bin/env python3# -*- coding: utf-8 -*-# @Author: dong dong# @Env: python 3.6from turtle import *# 无轨迹跳跃def my_goto(x, y): penup(...

Py爱好
昨天
0
0
shell及python脚本方式登录服务器

一、问题 在工作过程中,经常会遇见需要登录服务器,并且因为安全的原因,需要使用交互的方式登录,而且shell、python在工作中也经常用到,并且可以提供交互的功能。都是利用了expect、spawn...

yangjianzhou
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部