文档章节

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

Lofo
 Lofo
发布于 2017/06/01 09:47
字数 648
阅读 121
收藏 4

现在你多少听说一些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
悄悄在演变的java接口(jdk7-jdk9)

目录: 接口的定义 jdk7-9,接口属性的变化 jdk8,default、public static method的提出解决了什么问题,使用时需要注意什么 jdk9的补充(引入private method、private static method) 新老生...

ntchan
08/05
0
0
第一章:groovy 的语法和用法习惯

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

supperman
2012/11/16
0
0

没有更多内容

加载失败,请刷新页面

加载更多

ajax 提交返回map集合 获取不到值

后台java代码 @RequestMapping("/cameraList") @ResponseBody public Map<String, Object> cameraListForPage(@RequestParam(defaultValue = "1", value = "page") Integer page......

S三少S
5分钟前
0
0
TypeScrip最污的技术课-技术胖TypeScript图文视频教程

近日Node.js之父瑞安达尔(Ryan Dahl)发布新的开源项目 deno,从官方介绍来看,可以认为它是下一代 Node,使用 rust 语言代替 C++ 重新编写跨平台底层内核驱动,上层仍然使用 V8 引擎,最终...

JamesView
7分钟前
5
0
Es学习笔记

1.过滤排重聚合查询 筛选出某一个聚合值的个数统计。相当于mysql的distinct. 关键字:cardinality "aggs": { "2":{ "cardinality": { "field": "field" } ...

Gmupload
9分钟前
0
0
h5语义化标签

语义化HTML:用最恰当的HTML元素标签做恰当的事情。 优点: 提升可访问性; SEO; 结构清晰,利于维护; 通用容器:div——块级通用容器;span——短语内容无语义容器。 <title></title>:简...

莫西摩西
15分钟前
0
0
修改11g rac中 asm diskstring的发现路径

问题 : 如果我 们asm_disking以前是/dev/oracleasm/disks/* ,并且现在已经有磁盘组再用这个磁盘串了,那么,我们无法直接修改这个发现串为 ORCL:*,修改会报错,提示存在的磁盘无法使用新的...

tututu_jiang
18分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部