点击上方 "程序员小乐"关注, 星标或置顶一起成长
每天凌晨00点00分, 第一时间与你相约
每日英文
They always say time changes things but you actually have to change them by yourself.
人们总说时间会改变一切,但是实际上你需要自己努力去改变。
每日掏心话
人生在世会受许多委屈,别因此而难过,一个人越成功,他所遭受的委屈也会越多。
来自:urlify.cn/fyiIRr | 责编:乐乐
程序员小乐(ID:study_tech)第 971 次推文 图源:百度往日回顾:高并发系统如何做到限流,看这篇就对了!
正文
现在你多少听说一些JDK9 JShell相关的内容,这篇文章中将介绍如何使用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仓库中克隆。
搜索公众号程序员小乐回复关键字“offer”获取算法面试题和答案。
https://github.com/kotari4u/jshell_script_executor
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吧。
欢迎在留言区留下你的观点,一起讨论提高。如果今天的文章让你有新的启发,欢迎转发分享给更多人。欢迎加入程序员小乐技术交流群,在后台回复“加群”或者“学习”即可。
猜你还想看
MATLAB被禁影响升级!哈工大被曝在全国大学生数学建模竞赛中禁用MATLAB
关注订阅号「程序员小乐」,收看更多精彩内容
嘿,你在看吗?