Hi, dear readers! Welcome to my blog. This is the first post from a series focused on studying the new features from Java 9.
After waiting so much time for some features like Jigsaw, the so-called Java module feature, Java 9 is finally upon us. Let’s begin our journey by exploring the new REPL console for the language, JShell!
Installing Java 9
To install Java 9, I recommend following the instructions on this link.
REPL
REPL is a acronym that stands for Read-Eval-Print-Loop. A REPL is a terminal where we can input commands and receive immediate feedback about the code we just entered.
The code is readed, his syntax is evaluated, then executed, the results are printed on the console and finally the terminal loops for the next command, hence concluding the execution, just like the acronym dictates.
Starting JShell
To start JShell, we just open a terminal and enter:
JShell
This will initialize the shell, as we can see bellow:
| Welcome to JShell -- Version 9 | For an introduction type: /help intro jshell>
Just to finish our first glance at basic JShell commands, to exit the console, we just type:
jshell> /exit | Goodbye
Running commands
Now, let’s enter some commands. First, let’s create a String variable:
jshell> String myString = "Welcome to my JShell!" myString ==> "Welcome to my JShell!" jshell>
There’s two things we can notice on the code above: First, we don’t need to use a semicolon. Secondly, we can see the REPL in motion, as the code was processed and the results were printed on the console. If we just type the variable name, we can see that it will print his contents:
jshell> myString myString ==> "Welcome to my JShell!" jshell>
We can also use other types of commands as well, such as loops:
jshell> for (int i = 0;i < 10; i++) ...> System.out.println(i) 0 1 2 3 4 5 6 7 8 9 jshell>
It is also possible to make simple arithmetical operations. Let’s try a simple addition:
jshell> 1 + 2 $1 ==> 3 jshell>
Did you noticed we didn’t defined a variable? When we don’t include one, JShell do this for us, on this case, $1. This is defined by a $ followed by the command’s index, since JShell stores the commands of our session on a array-like structure.
We can see the command’s structure with the /list command, as follows:
jshell> /list 1 : 1 + 2 2 : String myString = "Welcome to my JShell!"; 3 : myString 4 : for (int i = 0;i < 10; i++) System.out.println(i); jshell>
Of course, variables implicit defined can also be used on other commands, as follows:
jshell> int i = $1 + 1 i ==> 4 jshell>
Editing scripts
JShell also allows us to edit and save scripts – snippets – of code, allowing us to create classes this way. Let’s see how to do it.
JShell comes with a editor, but it is also possible to change the editor for other of your choice. I will change my editor to Vim, using the following command:
jshell> /set editor vim | Editor set to: vim jshell>
Now that our editor is changed, let’s begin by opening the command with the for loop on the editor – on my case, is the command at index 4:
jshell> /edit 4
This will open the snippet on Vim editor. Let’s edit the code as follows and save:
public class MyObject { public static void myMethod() { for (int i = 0;i < 10; i++) System.out.println(i); } }
After saving, we will see a message indicating that the class was created:
jshell> /edit 4 | created class MyObject 0 1 2 3 4 5 6 7 8 9
we can also discard the old code with the /drop command:
/drop 4
Now, let’s try to use our class on the shell:
jshell> MyObject.myMethod() 0 1 2 3 4 5 6 7 8 9 jshell>
As we can see, the code was correctly executed, proving that our class creation was a success.
Importing & Exporting
Importing and exporting is done by the /save and /open commands. Let’s run the following command:
/save <path-to-save>/backup.txt
The result will be a file like the following:
1 + 2 String myString = "Welcome to my JShell!"; myString int i = $1 + 1; public class MyObject { public static void myMethod() { for (int i = 0;i < 10; i++) System.out.println(i); } } MyObject.myMethod()
Now, let’s close the shell with the /exit command and open again, cleaning our session.
Now, let’s run the /open command to import our previous commands:
/open <path-to-save>/backup.txt
And finally, let’s run the /list command to see if the commands from our backup were imported:
jshell> /list 1 : 1 + 2 2 : String myString = "Welcome to my JShell!"; 3 : myString 4 : int i = $1 + 1; 5 : public class MyObject { public static void myMethod() { for (int i = 0;i < 10; i++) System.out.println(i); } } 6 : MyObject.myMethod() jshell>
We can see that our import was a success, successfully importing the commands from the session.
Other commands
Of course there are other commands alongside the ones showed on this post as well. A complete list of all the commands in JShell can be found on JShell’s documentation.
Conclusion
And so we conclude our first glimpse on the new features of Java 9. JShell is a interesting new addition to the Java language, allowing us to quickly test and run Java code. It is not a tool for production use, on my opinion, but it is a good tool for development and learning purposes. Thank you for following me on this post, until next time.