Slide navigation: Forward with space bar, → arrow key, or PgDn. Backwards with ← or PgUp.

Copyright © Cay S. Horstmann 2016
javac from a Java program.JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
OutputStream outStream = ...;
OutputStream errStream = ...;
int result = compiler.run(null, outStream, errStream,
"-sourcepath", "src", "Test.java");result is 0.JavaCompiler.JavaCompiler.CompilationTask task = compiler.getTask(
errorWriter, fileManager, diagnosticListener,
options, classes, sources);
Boolean success = task.call(); // Call Future<Boolean>
options is an Iterable<String> such as Arrays.asList("-d", "bin").classes is only used for annotation processing.sources as:
StandardJavaFileManager fileManager
= compiler.getStandardFileManager(null, null, null);
Iterable<JavaFileObject> sources
= fileManager.getJavaFileObjectsFromFiles("File1.java", "File2.java");DiagnosticLister instance.DiagnosticCollector class implements the listener interface:
DiagnosticListener<JavaFileObject> diagnosticListener = new DiagnosticCollector<>();
Diagnostic objects:
for (Diagnostic<? extends JavaFileObject> d : collector.getDiagnostics()) ...
String filename = d.getSource().getName(); long lineNumber = d.getLineNumber(); String description = d.getMessage(Locale.getDefault());
public class StringSource extends SimpleJavaFileObject {
private String code;
StringSource(String name, String code) {
super(URI.create("string:///" + name.replace('.','/') + ".java"), Kind.SOURCE);
this.code = code;
}
public CharSequence getCharContent(boolean ignoreEncodingErrors) {
return code;
}
}List<StringSource> to the compiler.getTask method.ScriptEngine object:
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("nashorn");Object result = engine.eval(scriptString);
put method to add a binding to the script engine:
engine.put("k", 1728);
Object result = engine.eval("k + 1");
Bindings scope = engine.createBindings();
scope.put("k", 1728);
Object result = engine.eval("k + 1", scope);engine.eval("function greet(how, whom) { return how + ', ' + whom + '!' }");result = ((Invocable) engine).invokeFunction(
"greet", "Hello", "World");engine.eval("function Greeter(how) { this.how = how }");
engine.eval("Greeter.prototype.welcome = "
+ " function(whom) { return this.how + ', ' + whom + '!' }");invokeMethod:
Object yo = engine.eval("new Greeter('Yo')");
result = ((Invocable) engine).invokeMethod(yo, "welcome", "World");
public interface Greeter {
String welcome(String whom);
}engine.eval("function welcome(whom) { return 'Hello, ' + whom + '!' }");Greeter g = ((Invocable) engine).getInterface(Greeter.class);
result = g.welcome("World");
engine.eval(script for definingGreeterclass); Object obj = engine.eval(script for definingGreeterobject); Greeter g = ((Invocable) engine).getInterface(obj, Greeter.class); result = g.welcome("World");
jjs command:
~$ jjs
jjs> var url = new java.net.URL('http://horstmann.com')
jjs> var input = new java.util.Scanner(url.openStream())
jjs> input.useDelimiter('$')
java.util.Scanner[delimiters=$][position=0]...
jjs> input.next()
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"><head>
...
$ rlwrap jjs
var url = new java.net.URL('http://horstmann.com')
var input = new java.util.Scanner(url.openStream())
input.useDelimiter('$')
input.next()
java.lang.Math.floorMod(-2, 24)
var JMath = java.lang.Math // Avoids conflict with JavaScript Math object
JMath.floorMod(-2, 24)
var frame = new javax.swing.JFrame frame.title = "Hello" // Callsframe.setTitle("Hello")frame.visible // Callsframe.getVisible()
list['remove(Object)'](1) // Don't want the remove(int) method
var frame = new javax.swing.JFrame frame.title = "Hello" frame.setSize(200, 200) frame.visible
var intArray = Java.type('int[]')
var numbers = new intArray(10)
var jsNumbers = [1, 2, 3] var javaNumbers = Java.to(jsNumbers, intArray)
var names = java.util.Arrays.asList('Fred', 'Wilma', 'Barney')
var first = names[0]
names[0] = 'Duke'
var scores = new java.util.HashMap
scores['Fred'] = 10 // Calls scores.put('Fred', 10)
var square = function(x) { return x * x }
var result = square(2)
java.util.Arrays.sort(words,
function(a, b) { return a.length - b.length })return and the braces:
java.util.Arrays.sort(words, function(a, b) a.length - b.length)
Arrays.sort(words, (a, b) -> a.length - b.length)
jjs -scripting #!/opt/java/bin/jjs
`ls -al`
OPTS='-al'
`ls ${OPTS}`
stdin, call $EXEC(cmd, input)$EXEC("asadmin", <<END)
start-domain
start-database
deploy ${name} ${dir}
exit
END$ENV and $ARG hold environment variables and command line arguments:
var classpath=$ENV.CLASSPATH + ":" + $ARG[1]
jjs can take multiple script arguments, you need to provide -- before command-line arguments:
jjs script1.js script2.js -- arg0 arg1

`sort < /etc/group` `ls -al > /tmp/dir.txt` `ls -al | wc` `cd /usr/bin ; ls -al`