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 definingGreeter
class); Object obj = engine.eval(script for definingGreeter
object); 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