nashorn/docs/JavaScriptingProgrammersGuide.html
author johnc
Fri, 26 Apr 2013 10:57:57 -0700
changeset 17115 c4fc30982add
parent 16784 ba0dd689dd98
child 17747 57c9166de06e
permissions -rw-r--r--
8011898: gc/TestVerifyBeforeGCDuringStartup.java: java.lang.RuntimeException: '[Verifying' missing from stdout/stderr: [Error: Could not find or load main class] Summary: System.getProperty("test.java.opts") can return NULL, which gets converted to to the empty string, and the child java command then interprets that as the name of the main class. Reviewed-by: jmasa, brutisso
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
16784
ba0dd689dd98 8012048: JDK8 b85 source with GPL header errors
katleman
parents: 16522
diff changeset
     1
<!--
ba0dd689dd98 8012048: JDK8 b85 source with GPL header errors
katleman
parents: 16522
diff changeset
     2
 Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved.
ba0dd689dd98 8012048: JDK8 b85 source with GPL header errors
katleman
parents: 16522
diff changeset
     3
 DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
ba0dd689dd98 8012048: JDK8 b85 source with GPL header errors
katleman
parents: 16522
diff changeset
     4
ba0dd689dd98 8012048: JDK8 b85 source with GPL header errors
katleman
parents: 16522
diff changeset
     5
 This code is free software; you can redistribute it and/or modify it
ba0dd689dd98 8012048: JDK8 b85 source with GPL header errors
katleman
parents: 16522
diff changeset
     6
 under the terms of the GNU General Public License version 2 only, as
ba0dd689dd98 8012048: JDK8 b85 source with GPL header errors
katleman
parents: 16522
diff changeset
     7
 published by the Free Software Foundation.  Oracle designates this
ba0dd689dd98 8012048: JDK8 b85 source with GPL header errors
katleman
parents: 16522
diff changeset
     8
 particular file as subject to the "Classpath" exception as provided
ba0dd689dd98 8012048: JDK8 b85 source with GPL header errors
katleman
parents: 16522
diff changeset
     9
 by Oracle in the LICENSE file that accompanied this code.
ba0dd689dd98 8012048: JDK8 b85 source with GPL header errors
katleman
parents: 16522
diff changeset
    10
ba0dd689dd98 8012048: JDK8 b85 source with GPL header errors
katleman
parents: 16522
diff changeset
    11
 This code is distributed in the hope that it will be useful, but WITHOUT
ba0dd689dd98 8012048: JDK8 b85 source with GPL header errors
katleman
parents: 16522
diff changeset
    12
 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
ba0dd689dd98 8012048: JDK8 b85 source with GPL header errors
katleman
parents: 16522
diff changeset
    13
 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
ba0dd689dd98 8012048: JDK8 b85 source with GPL header errors
katleman
parents: 16522
diff changeset
    14
 version 2 for more details (a copy is included in the LICENSE file that
ba0dd689dd98 8012048: JDK8 b85 source with GPL header errors
katleman
parents: 16522
diff changeset
    15
 accompanied this code).
ba0dd689dd98 8012048: JDK8 b85 source with GPL header errors
katleman
parents: 16522
diff changeset
    16
ba0dd689dd98 8012048: JDK8 b85 source with GPL header errors
katleman
parents: 16522
diff changeset
    17
 You should have received a copy of the GNU General Public License version
ba0dd689dd98 8012048: JDK8 b85 source with GPL header errors
katleman
parents: 16522
diff changeset
    18
 2 along with this work; if not, write to the Free Software Foundation,
ba0dd689dd98 8012048: JDK8 b85 source with GPL header errors
katleman
parents: 16522
diff changeset
    19
 Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
ba0dd689dd98 8012048: JDK8 b85 source with GPL header errors
katleman
parents: 16522
diff changeset
    20
ba0dd689dd98 8012048: JDK8 b85 source with GPL header errors
katleman
parents: 16522
diff changeset
    21
 Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
ba0dd689dd98 8012048: JDK8 b85 source with GPL header errors
katleman
parents: 16522
diff changeset
    22
 or visit www.oracle.com if you need additional information or have any
ba0dd689dd98 8012048: JDK8 b85 source with GPL header errors
katleman
parents: 16522
diff changeset
    23
 questions.
ba0dd689dd98 8012048: JDK8 b85 source with GPL header errors
katleman
parents: 16522
diff changeset
    24
-->
16212
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
    25
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
    26
<html class=" regenabled  gecko radius jsenabled regloaded" xmlns="http://www.w3.org/1999/xhtml"><head>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
    27
<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
    28
<title>Java Scripting Programmer's Guide</title>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
    29
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
    30
<!-- ============ -->
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
    31
<!-- MAIN CONTENT -->
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
    32
<!-- ============ -->
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
    33
<table summary="layout" border="0" width="100%">
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
    34
<tbody><tr>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
    35
<td>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
    36
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
    37
<div id="sharepage" class="smallpagetitle"><h1>Java Scripting Programmer's Guide</h1><div class="sharepage">		<div class="sharepagew1 share-mailto">		<table summary="" cellpadding="0" cellspacing="0"><tbody><tr>		<td id="share-mailto"><a href="mailto:?subject=Java%20Documentation%20Page:%20Java%20Scripting%20Programmer%27s%20Guide&amp;body=Check%20out%20this%20page:%20%0A%0Ahttp%3A%2F%2Fdocs.oracle.com%2Fjavase%2F6%2Fdocs%2Ftechnotes%2Fguides%2Fscripting%2Fprogrammer_guide%2Findex.html" class="sharelink mailto" title="Email this page to a friend"></a></td>		<td id="share-technorati"><a href="http://technorati.com/search/http%3A%2F%2Fdocs.oracle.com%2Fjavase%2F6%2Fdocs%2Ftechnotes%2Fguides%2Fscripting%2Fprogrammer_guide%2Findex.html" class="sharelink technorati" title="See who links to this page on Technorati"></a></td>		<td id="share-delicious"><a href="http://del.icio.us/post?v=4;url=http%3A%2F%2Fdocs.oracle.com%2Fjavase%2F6%2Fdocs%2Ftechnotes%2Fguides%2Fscripting%2Fprogrammer_guide%2Findex.html;title=Java%20Scripting%20Programmer%27s%20Guide" class="sharelink delicious" title="Bookmark this page in del.icio.us"></a></td>		<td id="share-digg"><a href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fdocs.oracle.com%2Fjavase%2F6%2Fdocs%2Ftechnotes%2Fguides%2Fscripting%2Fprogrammer_guide%2Findex.html&amp;title=Java%20Scripting%20Programmer%27s%20Guide" class="sharelink digg" title="Submit this page to Digg"></a></td>		<td id="share-slashdot"><a href="http://slashdot.org/bookmark.pl?title=Java%20Scripting%20Programmer%27s%20Guide&amp;url=http%3A%2F%2Fdocs.oracle.com%2Fjavase%2F6%2Fdocs%2Ftechnotes%2Fguides%2Fscripting%2Fprogrammer_guide%2Findex.html" class="sharelink slashdot" title="Submit this page to Slashdot"></a></td>		<td id="share-blank"> </td></tr></tbody></table></div></div></div>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
    38
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
    39
</td>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
    40
</tr>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
    41
</tbody></table>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
    42
<!-- Body text begins here -->
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
    43
<ul>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
    44
<li><span><a href="#who">Who is the Java Scripting API
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
    45
For?</a></span></li>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
    46
<li><span><a href="#package">Scripting Package</a></span></li>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
    47
<li><span><a href="#examples">Examples</a></span>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
    48
<ul>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
    49
<li><span><a href="#helloworld">"Hello, World"</a></span></li>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
    50
<li><span><a href="#evalfile">Evaluating a Script
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
    51
File</a></span></li>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
    52
<li><span><a href="#scriptvars">Script Variables</a></span></li>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
    53
<li><span><a href="#invoke">Invoking Script Functions and
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
    54
Methods</a></span></li>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
    55
<li><span><a href="#interfaces">Implementing Java Interfaces by
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
    56
Scripts</a></span></li>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
    57
<li><span><a href="#scopes">Multiple Scopes for
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
    58
Scripts</a></span></li>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
    59
</ul>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
    60
</li>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
    61
<li><span><a href="#jsengine">JavaScript Script
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
    62
Engine</a></span></li>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
    63
<li><span><a href="#jstojava">JavaScript to Java
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
    64
Communication</a></span>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
    65
<ul>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
    66
<li><span><a href="#jsjavaclass">Accessing Java
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
    67
Classes</a></span></li>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
    68
<li><span><a href="#jsimport">Importing Java Packages,
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
    69
Classes</a></span></li>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
    70
<li><span><a href="#jsarrays">Creating, Converting and Using Java
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
    71
Arrays</a></span></li>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
    72
<li><span><a href="#jsimplement">Implementing Java
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
    73
Interfaces</a></span></li>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
    74
<li><span><a href="#jsextend">Extending Java classes
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
    75
</a></span></li>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
    76
<li><span><a href="#jsoverload">Overload Resolution</a></span></li>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
    77
</ul>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
    78
</li>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
    79
<li><span><a href="#engineimpl">Implementing Your Own Script
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
    80
Engine</a></span></li>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
    81
<li><span><a href="#refs">References</a></span></li>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
    82
</ul>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
    83
<span><a name="who" id="who"></a></span>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
    84
<h2><span>Who is the Java Scripting API For?</span></h2>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
    85
<span>Some useful characteristics of scripting languages
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
    86
are:</span>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
    87
<ul>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
    88
<li><span><b>Convenience</b>: Most scripting languages are
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
    89
dynamically typed. You can usually create new variables without
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
    90
declaring the variable type, and you can reuse variables to store
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
    91
objects of different types. Also, scripting languages tend to
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
    92
perform many type conversions automatically, for example,
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
    93
converting the number 10 to the text "10" as necessary.</span></li>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
    94
<li><span><b>Developing rapid prototypes</b>: You can avoid the
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
    95
edit-compile-run cycle and just use edit-run!</span></li>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
    96
<li><span><b>Application extension/customization</b>: You can
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
    97
"externalize" parts of your application - like configuration
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
    98
scripts, business logic/rules and math expressions for financial
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
    99
applications.</span></li>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   100
<li><span><b>"Command line" shells for applications</b> -for
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   101
debugging, runtime/deploy time configuration etc. Most applications
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   102
have a web-based GUI configuaration tool these days. But
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   103
sysadmins/deployers frequently prefer command line tools. Instead
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   104
of inventing ad-hoc scripting language for that purpose, a
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   105
"standard" scripting language can be used.</span></li>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   106
</ul>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   107
<p><span>The Java<font size="-1"><sup>TM</sup></font> Scripting API
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   108
is a scripting language indepedent framework for using script
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   109
engines from Java code. With the Java Scripting API, it is possible
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   110
to write customizable/extendable applications in the Java language
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   111
and leave the customization scripting language choice to the end
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   112
user. The Java application developer need not choose the extension
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   113
language during development. If you write your application with
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   114
JSR-223 API, then your users can use any JSR-223 compliant
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   115
scripting language.</span></p>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   116
<hr>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   117
<span><a name="package" id="package"></a></span>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   118
<h2><span>Scripting Package</span></h2>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   119
<p><span>The Java Scripting functionality is in the <code><a href="http://docs.oracle.com/javase/6/docs/api/javax/script/package-summary.html">javax.script</a></code>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   120
package. This is a relatively small, simple API. The starting point
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   121
of the scripting API is the <code>ScriptEngineManager</code> class.
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   122
A ScriptEngineManager object can discover script engines through
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   123
the jar file service discovery mechanism. It can also instantiate
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   124
ScriptEngine objects that interpret scripts written in a specific
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   125
scripting language. The simplest way to use the scripting API is as
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   126
follows:</span></p>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   127
<ol>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   128
<li><span>Create a <code>ScriptEngineManager</code>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   129
object.</span></li>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   130
<li><span>Get a <code>ScriptEngine</code> object from the
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   131
manager.</span></li>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   132
<li><span>Evaluate script using the <code>ScriptEngine</code>'s
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   133
<code>eval</code> methods.</span></li>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   134
</ol>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   135
<p><span>Now, it is time to look at some sample code. While it is
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   136
not mandatory, it may be useful to know a bit of JavaScript to read
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   137
these examples.</span></p>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   138
<hr>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   139
<span><a name="examples" id="examples"></a></span>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   140
<h2><span>Examples</span></h2>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   141
<span><a name="helloworld" id="helloworld"></a></span>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   142
<h3><span>"Hello, World"</span></h3>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   143
<p><span>From the <code>ScriptEngineManager</code> instance, we
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   144
request a JavaScript engine instance using
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   145
<code>getEngineByName</code> method. On the script engine, the
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   146
<code>eval</code> method is called to execute a given String as
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   147
JavaScript code! For brevity, in this as well as in subsequent
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   148
examples, we have not shown exception handling. There are checked
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   149
and runtime exceptions thrown from <code>javax.script</code> API.
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   150
Needless to say, you have to handle the exceptions
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   151
appropriately.</span></p>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   152
<pre>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   153
<span><code>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   154
// <a href="source/EvalScript.java">EvalScript.java</a>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   155
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   156
import javax.script.*;
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   157
public class EvalScript {
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   158
    public static void main(String[] args) throws Exception {
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   159
        // create a script engine manager
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   160
        <span class="classref">ScriptEngineManager</span> factory = new ScriptEngineManager();
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   161
        // create a JavaScript engine
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   162
        <span class="classref">ScriptEngine</span> engine = factory.<span class="methodref">getEngineByName</span>("nashorn");
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   163
        // evaluate JavaScript code from String
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   164
        engine.<span class="methodref">eval</span>("print('Hello, World')");
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   165
    }
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   166
}
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   167
</code></span>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   168
</pre>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   169
<hr>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   170
<a name="evalfile" id="evalfile"></a>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   171
<h3>Evaluating a Script File</h3>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   172
<p>In this example, we call the <code>eval</code> method that
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   173
accepts <code>java.io.Reader</code> for the input source. The
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   174
script read by the given reader is executed. This way it is
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   175
possible to execute scripts from files, URLs and resources by
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   176
wrapping the relevant input stream objects as readers.</p>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   177
<pre>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   178
<code>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   179
// <a href="source/EvalFile.java">EvalFile.java</a>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   180
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   181
import javax.script.*;
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   182
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   183
public class EvalFile {
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   184
    public static void main(String[] args) throws Exception {
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   185
        // create a script engine manager
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   186
        <span class="classref">ScriptEngineManager</span> factory = new ScriptEngineManager();
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   187
        // create JavaScript engine
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   188
        <span class="classref">ScriptEngine</span> engine = factory.<span class="methodref">getEngineByName</span>("nashorn");
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   189
        // evaluate JavaScript code from given file - specified by first argument
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   190
        engine.<span class="methodref">eval</span>(new java.io.FileReader(args[0]));
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   191
    }
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   192
}
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   193
</code>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   194
</pre>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   195
Let us assume that we have the file named <a href="source/test.js">test.js</a> with the
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   196
following text:
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   197
<pre><code>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   198
print("This is hello from test.js");
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   199
</code>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   200
</pre>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   201
We can run the above Java as
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   202
<pre><code>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   203
java EvalFile test.js
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   204
</code>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   205
</pre>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   206
<hr>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   207
<a name="scriptvars" id="scriptvars"></a>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   208
<h3>Script Variables</h3>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   209
<p>When you embed script engines and scripts with your Java
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   210
application, you may want to expose your application objects as
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   211
global variables to scripts. This example demonstrates how you can
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   212
expose your application objects as global variables to a script. We
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   213
create a <code>java.io.File</code> in the application and expose
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   214
the same as a global variable with the name "file". The script can
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   215
access the variable - for example, it can call public methods on
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   216
it. Note that the syntax to access Java objects, methods and fields
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   217
is dependent on the scripting language. JavaScript supports the
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   218
most "natural" Java-like syntax.</p>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   219
<pre><code>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   220
// <a href="source/ScriptVars.java">ScriptVars.java</a>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   221
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   222
import javax.script.*;
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   223
import java.io.*;
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   224
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   225
public class ScriptVars { 
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   226
    public static void main(String[] args) throws Exception {
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   227
        ScriptEngineManager manager = new ScriptEngineManager();
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   228
        ScriptEngine engine = manager.getEngineByName("nashorn");
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   229
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   230
        File f = new File("test.txt");
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   231
        // expose File object as variable to script
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   232
        engine.<span class="methodref">put</span>("file", f);
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   233
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   234
        // evaluate a script string. The script accesses "file" 
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   235
        // variable and calls method on it
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   236
        engine.eval("print(file.getAbsolutePath())");
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   237
    }
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   238
}
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   239
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   240
</code>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   241
</pre>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   242
<hr>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   243
<a name="invoke" id="invoke"></a>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   244
<h3>Invoking Script Functions and Methods</h3>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   245
<p>Sometimes you may want to call a specific scripting function
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   246
repeatedly - for example, your application menu functionality might
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   247
be implemented by a script. In your menu's action event handler you
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   248
may want to call a specific script function. The following example
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   249
demonstrates invoking a specific script function from Java
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   250
code.</p>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   251
<pre><code>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   252
// <a href="source/InvokeScriptFunction.java">InvokeScriptFunction.java</a>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   253
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   254
import javax.script.*;
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   255
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   256
public class InvokeScriptFunction {
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   257
    public static void main(String[] args) throws Exception {
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   258
        ScriptEngineManager manager = new ScriptEngineManager();
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   259
        ScriptEngine engine = manager.getEngineByName("nashorn");
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   260
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   261
        // JavaScript code in a String
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   262
        String script = "function hello(name) { print('Hello, ' + name); }";
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   263
        // evaluate script
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   264
        engine.eval(script);
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   265
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   266
        // <code>javax.script.Invocable</code> is an optional interface.
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   267
        // Check whether your script engine implements it or not!
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   268
        // Note that the JavaScript engine implements Invocable interface.
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   269
        <span class="classref">Invocable</span> inv = (Invocable) engine;
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   270
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   271
        // invoke the global function named "hello"
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   272
        inv.<span class="methodref">invokeFunction</span>("hello", "Scripting!!" );
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   273
    }
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   274
}
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   275
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   276
</code>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   277
</pre>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   278
<p>If your scripting language is object based (like JavaScript) or
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   279
object-oriented, then you can invoke a script method on a script
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   280
object.</p>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   281
<pre><code>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   282
// <a href="source/InvokeScriptMethod.java">InvokeScriptMethod.java</a>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   283
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   284
import javax.script.*;
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   285
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   286
public class InvokeScriptMethod {
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   287
    public static void main(String[] args) throws Exception {
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   288
        ScriptEngineManager manager = new ScriptEngineManager();
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   289
        ScriptEngine engine = manager.getEngineByName("nashorn");
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   290
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   291
        // JavaScript code in a String. This code defines a script object 'obj'
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   292
        // with one method called 'hello'.        
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   293
        String script = "var obj = new Object(); obj.hello = function(name) { print('Hello, ' + name); }";
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   294
        // evaluate script
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   295
        engine.eval(script);
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   296
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   297
        // <code>javax.script.Invocable</code> is an optional interface.
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   298
        // Check whether your script engine implements or not!
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   299
        // Note that the JavaScript engine implements Invocable interface.
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   300
        <span class="classref">Invocable</span> inv = (Invocable) engine;
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   301
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   302
        // get script object on which we want to call the method
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   303
        Object obj = engine.<span class="methodref">get</span>("obj");
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   304
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   305
        // invoke the method named "hello" on the script object "obj"
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   306
        inv.<span class="methodref">invokeMethod</span>(obj, "hello", "Script Method !!" );
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   307
    }
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   308
}
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   309
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   310
</code>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   311
</pre>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   312
<hr>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   313
<a name="interfaces" id="interfaces"></a>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   314
<h3>Implementing Java Interfaces by Scripts</h3>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   315
<p>Instead of calling specific script functions from Java,
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   316
sometimes it is convenient to implement a Java interface by script
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   317
functions or methods. Also, by using interfaces we can avoid having
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   318
to use the <code>javax.script</code> API in many places. We can get
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   319
an interface implementor object and pass it to various Java APIs.
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   320
The following example demonstrates implementing the
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   321
<code>java.lang.Runnable</code> interface with a script.</p>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   322
<pre><code>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   323
// <a href="source/RunnableImpl.java">RunnableImpl.java</a>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   324
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   325
import javax.script.*;
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   326
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   327
public class RunnableImpl {
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   328
    public static void main(String[] args) throws Exception {
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   329
        ScriptEngineManager manager = new ScriptEngineManager();
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   330
        ScriptEngine engine = manager.getEngineByName("nashorn");
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   331
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   332
        // JavaScript code in a String
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   333
        String script = "function run() { print('run called'); }";
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   334
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   335
        // evaluate script
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   336
        engine.eval(script);
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   337
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   338
        <span class="classref">Invocable</span> inv = (Invocable) engine;
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   339
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   340
        // get Runnable interface object from engine. This interface methods
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   341
        // are implemented by script functions with the matching name.
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   342
        Runnable r = inv.<span class="methodref">getInterface</span>(Runnable.class);
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   343
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   344
        // start a new thread that runs the script implemented
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   345
        // runnable interface
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   346
        Thread th = new Thread(r);
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   347
        th.start();
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   348
        th.join();
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   349
    }
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   350
}
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   351
</code>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   352
</pre>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   353
<p>If your scripting language is object-based or object-oriented,
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   354
it is possible to implement a Java interface by script methods on
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   355
script objects. This avoids having to call script global functions
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   356
for interface methods. The script object can store the "state"
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   357
associated with the interface implementor.</p>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   358
<pre><code>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   359
// <a href="source/RunnableImplObject.java">RunnableImplObject.java</a>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   360
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   361
import javax.script.*;
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   362
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   363
public class RunnableImplObject {
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   364
    public static void main(String[] args) throws Exception {
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   365
        ScriptEngineManager manager = new ScriptEngineManager();
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   366
        ScriptEngine engine = manager.getEngineByName("nashorn");
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   367
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   368
        // JavaScript code in a String
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   369
        String script = "var obj = new Object(); obj.run = function() { print('run method called'); }";
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   370
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   371
        // evaluate script
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   372
        engine.eval(script);
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   373
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   374
        // get script object on which we want to implement the interface with
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   375
        Object obj = engine.<span class="methodref">get</span>("obj");
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   376
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   377
        <span class="classref">Invocable</span> inv = (Invocable) engine;
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   378
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   379
        // get Runnable interface object from engine. This interface methods
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   380
        // are implemented by script methods of object 'obj'
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   381
        Runnable r = inv.<span class="methodref">getInterface</span>(obj, Runnable.class);
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   382
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   383
        // start a new thread that runs the script implemented
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   384
        // runnable interface
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   385
        Thread th = new Thread(r);
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   386
        th.start();
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   387
        th.join();
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   388
    }
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   389
}
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   390
</code>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   391
</pre>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   392
<hr>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   393
<a name="scopes" id="scopes"></a>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   394
<h3>Multiple Scopes for Scripts</h3>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   395
<p>In the <a href="#scriptvars">script variables</a> example, we
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   396
saw how to expose application objects as script global variables.
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   397
It is possible to expose multiple global "scopes" for scripts. A
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   398
single scope is an instance of <code>javax.script.Bindings</code>.
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   399
This interface is derived from <code>java.util.Map&lt;String,
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   400
Object&gt;</code>. A scope a set of name-value pairs where name is
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   401
any non-empty, non-null String.
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   402
<code>javax.script.ScriptContext</code> interface supports multiple
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   403
scopes with associated Bindings for each
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   404
scope. By default, every script engine has a default script
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   405
context. The default script context has atleast one scope called
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   406
"ENGINE_SCOPE". Various scopes supported by a script context are
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   407
available through <code>getScopes</code> method.</p>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   408
<pre><code>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   409
// <a href="source/MultiScopes.java">MultiScopes.java</a>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   410
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   411
import javax.script.*;
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   412
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   413
public class MultiScopes {
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   414
    public static void main(String[] args) throws Exception {
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   415
        ScriptEngineManager manager = new ScriptEngineManager();
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   416
        ScriptEngine engine = manager.getEngineByName("nashorn");
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   417
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   418
        engine.put("x", "hello");
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   419
        // print global variable "x"
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   420
        engine.eval("print(x);");
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   421
        // the above line prints "hello"
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   422
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   423
        // Now, pass a different script context
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   424
        <span class="classref">ScriptContext</span> newContext = new <span class="classref">SimpleScriptContext</span>();
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   425
        newContext.setBindings(engine.createBindings(), ScriptContext.ENGINE_SCOPE);
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   426
        <span class="classref">Bindings</span> engineScope = newContext.<span class="methodref">getBindings</span>(ScriptContext.ENGINE_SCOPE);
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   427
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   428
        // add new variable "x" to the new engineScope        
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   429
        engineScope.<span class="methodref">put</span>("x", "world");
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   430
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   431
        // execute the same script - but this time pass a different script context
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   432
        engine.eval("print(x);", newContext);
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   433
        // the above line prints "world"
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   434
    }
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   435
}
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   436
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   437
</code>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   438
</pre>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   439
<hr>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   440
<a name="jsengine" id="jsengine"></a>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   441
<h2>JavaScript Script Engine</h2>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   442
<p>Oracle's implementation of JDK 8 is co-bundled with the Nashorn ECMAScript
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   443
script engine.
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   444
<hr>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   445
<a name="jstojava" id="jstojava"></a>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   446
<h2>JavaScript to Java Communication</h2>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   447
<p>For the most part, accessing Java classes, objects and methods
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   448
is straightforward. In particular field and method access from
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   449
JavaScript is the same as it is from Java. We highlight important
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   450
aspects of JavaScript Java access here. 
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   451
The following examples are JavaScript snippets accessing Java. This
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   452
section requires knowledge of JavaScript. This section can be
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   453
skipped if you are planning to use some other JSR-223 scripting
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   454
language rather than JavaScript.</p>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   455
<hr>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   456
<a name="jsjavaclass" id=jsjavalass"></a>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   457
<h3>Accessing Java Classes</h3>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   458
<pre>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   459
<code>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   460
// <a href="source/javatypes.js">javatypes.js</a>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   461
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   462
 var arrayListType = Java.type("java.util.ArrayList")
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   463
 var intType = Java.type("int")
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   464
 var stringArrayType = Java.type("java.lang.String[]")
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   465
 var int2DArrayType = Java.type("int[][]")
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   466
</code>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   467
</pre> 
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   468
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   469
Note that the name of the type is always a string for a fully qualified name. You can use any of these types to create new instances, e.g.:
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   470
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   471
<pre><code>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   472
 var anArrayList = new Java.type("java.util.ArrayList")
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   473
</code></pre> 
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   474
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   475
or
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   476
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   477
<pre><code>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   478
 var ArrayList = Java.type("java.util.ArrayList")
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   479
 var anArrayList = new ArrayList
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   480
 var anArrayListWithSize = new ArrayList(16)
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   481
</code></pre> 
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   482
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   483
In the special case of inner classes, you need to use the JVM fully qualified name, meaning using $ sign in the class name:
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   484
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   485
<pre><code>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   486
 var ftype = Java.type("java.awt.geom.Arc2D$Float")
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   487
</code></pre> 
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   488
 
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   489
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   490
However, once you retrieved the outer class, you can access the inner class as a property on it:
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   491
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   492
<pre><code>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   493
 var arctype = Java.type("java.awt.geom.Arc2D")
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   494
 var ftype = arctype.Float
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   495
</code></pre> 
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   496
<p>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   497
You can access both static and non-static inner classes. If you want to create an instance of a non-static inner class, remember to pass an instance of its outer class as the first argument to the constructor.
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   498
</p>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   499
<hr>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   500
<a name="jsimport" id="jsimport"></a>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   501
<h3>Importing Java Packages, Classes</h3>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   502
<p>The built-in functions <code>importPackage</code> (in compatibility script) and
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   503
<code>importClass</code> can be used to import Java packages and
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   504
classes.</p>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   505
<pre><code>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   506
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   507
// <a href="source/importpackageclass.js">importpackageclass.js</a>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   508
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   509
// load compatibility script
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   510
load("nashorn:mozilla_compat.js");
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   511
// Import Java packages and classes 
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   512
// like import package.*; in Java
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   513
<span class="functionref">importPackage</span>(java.awt);
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   514
// like import java.awt.Frame in Java
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   515
<span class="functionref">importClass</span>(java.awt.Frame);
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   516
// Create Java Objects by "new ClassName"
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   517
var frame = new java.awt.Frame("hello");
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   518
// Call Java public methods from script
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   519
frame.setVisible(true);
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   520
// Access "JavaBean" properties like "fields"
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   521
print(frame.title);
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   522
</code>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   523
</pre>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   524
<p>The <span class="objectref">Packages</span> global variable can
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   525
be used to access Java packages. Examples:
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   526
<code>Packages.java.util.Vector</code>,
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   527
<code>Packages.javax.swing.JFrame</code>. Please note that "java"
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   528
is a shortcut for "Packages.java". There are equivalent shortcuts
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   529
for javax, org, edu, com, net prefixes, so pratically all JDK
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   530
platform classes can be accessed without the "Packages" prefix.</p>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   531
<p>Note that java.lang is not imported by default (unlike Java)
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   532
because that would result in conflicts with JavaScript's built-in
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   533
Object, Boolean, Math and so on.</p>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   534
<p><code>importPackage</code> and <code>importClass</code>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   535
functions "pollute" the global variable scope of JavaScript. To
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   536
avoid that, you may use <span class="functionref">JavaImporter</span>.</p>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   537
<pre><code>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   538
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   539
// <a href="source/javaimporter.js">javaimporter.js</a>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   540
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   541
// create JavaImporter with specific packages and classes to import
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   542
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   543
var SwingGui = new <span class="functionref">JavaImporter</span>(javax.swing,
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   544
                            javax.swing.event,
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   545
                            javax.swing.border,
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   546
                            java.awt.event);
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   547
with (SwingGui) {
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   548
    // within this 'with' statement, we can access Swing and AWT
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   549
    // classes by unqualified (simple) names.
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   550
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   551
    var mybutton = new JButton("test");
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   552
    var myframe = new JFrame("test");
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   553
}
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   554
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   555
</code>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   556
</pre>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   557
<hr>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   558
<a name="jsarrays" id="jsarrays"></a>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   559
<h3>Creating, Converting and Using Java Arrays</h3>
16522
d643e3ee819c 8009757: Package access clean up and refactoring
sundar
parents: 16212
diff changeset
   560
<p>
d643e3ee819c 8009757: Package access clean up and refactoring
sundar
parents: 16212
diff changeset
   561
Array element access or length access is
16212
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   562
the same as in Java. Also, a script array can be used when a Java
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   563
method expects a Java array (auto conversion). So in most cases we
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   564
don't have to create Java arrays explicitly.</p>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   565
<pre><code>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   566
// <a href="source/javaarray.js">javaarray.js</a>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   567
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   568
// create Java String array of 5 elements
16522
d643e3ee819c 8009757: Package access clean up and refactoring
sundar
parents: 16212
diff changeset
   569
var StringArray = Java.type("java.lang.String[]");
d643e3ee819c 8009757: Package access clean up and refactoring
sundar
parents: 16212
diff changeset
   570
var a = new StringArray(5);
16212
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   571
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   572
// Accessing elements and length access is by usual Java syntax
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   573
a[0] = "scripting is great!";
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   574
print(a.length);
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   575
print(a[0]);
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   576
</code>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   577
</pre>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   578
<p>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   579
It is also possible to convert between JavaScript and Java arrays.
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   580
Given a JavaScript array and a Java type, <code>Java.toJavaArray</code> returns a Java array with the same initial contents, and with the specified component type. 
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   581
</p>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   582
<pre><code>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   583
 var anArray = [1, "13", false]
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   584
 var javaIntArray = Java.toJavaArray(anArray, "int")
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   585
 print(javaIntArray[0]) // prints 1
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   586
 print(javaIntArray[1]) // prints 13, as string "13" was converted to number 13 as per ECMAScript ToNumber conversion
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   587
 print(javaIntArray[2]) // prints 0, as boolean false was converted to number 0 as per ECMAScript ToNumber conversion
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   588
</code></pre>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   589
<p>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   590
Given a Java array or Collection, <code>Java.toJavaScriptArray</code> returns a JavaScript array with a shallow copy of its contents. Note that in most cases, you can use Java arrays and lists natively in Nashorn; in cases where for some reason you need to have an actual JavaScript native array (e.g. to work with the array comprehensions functions), you will want to use this method.i
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   591
</p>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   592
<pre><code>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   593
var File = Java.type("java.io.File");
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   594
var listCurDir = new File(".").listFiles();
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   595
var jsList = Java.toJavaScriptArray(listCurDir);
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   596
print(jsList);
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   597
</code></pre>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   598
<hr>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   599
<a name="jsimplement" id="jsimplement"></a>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   600
<h3>Implementing Java Interfaces</h3>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   601
<p>A Java interface can be implemented in JavaScript by using a
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   602
Java anonymous class-like syntax:</p>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   603
<pre><code>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   604
// <a href="source/runnable.js">runnable.js</a>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   605
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   606
var r  = new java.lang.Runnable() {
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   607
    run: function() {
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   608
        print("running...\n");
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   609
    }
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   610
};
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   611
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   612
// "r" can be passed to Java methods that expect java.lang.Runnable
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   613
var th = new java.lang.Thread(r);
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   614
th.start();
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   615
th.join();
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   616
</code>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   617
</pre>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   618
<p>When an interface with a single method is expected, you can pass
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   619
a script function directly.(auto conversion)</p>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   620
<pre><code>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   621
// <a href="source/samfunc.js">samfunc.js</a>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   622
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   623
function func() {
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   624
     print("I am func!");
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   625
}
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   626
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   627
// pass script function for java.lang.Runnable argument
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   628
var th = new java.lang.Thread(func);
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   629
th.start();
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   630
th.join();
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   631
</code>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   632
</pre>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   633
<hr>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   634
<a name="jsextend" id="jsextend"></a>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   635
<h3>Extending Java classes</h3>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   636
<p>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   637
If a Java class is abstract, you can instantiate an anonymous subclass of it using an argument list that is applicable to any of its public or protected constructors, but inserting a JavaScript object with functions properties that provide JavaScript implementations of the abstract methods. If method names are overloaded, the JavaScript function will provide implementation for all overloads. E.g.:
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   638
</p>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   639
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   640
<pre><code>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   641
 var TimerTask =  Java.type("java.util.TimerTask")
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   642
 var task = new TimerTask({ run: function() { print("Hello World!") } })
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   643
</code></pre>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   644
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   645
Nashorn supports a syntactic extension where a "new" expression followed by an argument is identical to invoking the constructor and passing the argument to it, so you can write the above example also as:
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   646
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   647
<pre><code>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   648
 var task = new TimerTask {
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   649
     run: function() {
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   650
       print("Hello World!")
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   651
     }
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   652
 }
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   653
</code></pre>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   654
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   655
which is very similar to Java anonymous inner class definition. On the other hand, if the type is an abstract type with a single abstract method (commonly referred to as a "SAM type") or all abstract methods it has share the same overloaded name), then instead of an object, you can just pass a function, so the above example can become even more simplified to:
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   656
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   657
<pre><code>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   658
 var task = new TimerTask(function() { print("Hello World!") })
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   659
</code></pre>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   660
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   661
<p>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   662
Note that in every one of these cases if you are trying to instantiate an abstract class that has constructors that take some arguments, you can invoke those simply by specifying the arguments after the initial implementation object or function.
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   663
</p>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   664
<p>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   665
The use of functions can be taken even further; if you are invoking a Java method that takes a SAM type, you can just pass in a function object, and Nashorn will know what you meant:
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   666
</p>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   667
<code><pre>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   668
 Java.type("java.util.Timer")
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   669
 timer.schedule(function() { print("Hello World!") })
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   670
</code></pre>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   671
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   672
Here, <code>Timer.schedule()</code> expects a <code>TimerTask</code> as its argument, so Nashorn creates an instance of a TimerTask subclass and uses the passed function to implement its only abstract method, run(). In this usage though, you can't use non-default constructors; the type must be either an interface, or must have a protected or public no-arg constructor.
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   673
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   674
<p>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   675
To extend a concrete Java class, you have to use <code>Java.extend</code> function.
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   676
<code>Java.extend</code> returns a type object for a subclass of the specified Java class (or implementation of the specified interface) that acts as a script-to-Java adapter for it.  
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   677
</p>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   678
<pre><code>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   679
// <a href="source/javaextend.js">javaextend.js</a>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   680
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   681
var ArrayList = Java.type("java.util.ArrayList")
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   682
var ArrayListExtender = Java.extend(ArrayList)
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   683
var printSizeInvokedArrayList = new ArrayListExtender() {
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   684
    size: function() { print("size invoked!"); }
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   685
}
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   686
var printAddInvokedArrayList = new ArrayListExtender() {
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   687
    add: function(x, y) {
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   688
        if(typeof(y) === "undefined") {
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   689
            print("add(e) invoked!");
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   690
        } else {
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   691
            print("add(i, e) invoked!");
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   692
        }
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   693
    }
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   694
};
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   695
printSizeInvokedArrayList.size();
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   696
printAddInvokedArrayList.add(33, 33);
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   697
</code></pre>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   698
<hr>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   699
<a name="jsoverload" id="jsoverload"></a>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   700
<h3>Overload Resolution</h3>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   701
<p>Java methods can be overloaded by argument types. In Java,
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   702
overload resolution occurs at compile time (performed by javac).
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   703
When calling Java methods from a script, the script
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   704
interpreter/compiler needs to select the appropriate method. With
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   705
the JavaScript engine, you do not need to do anything special - the
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   706
correct Java method overload variant is selected based on the
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   707
argument types. But, sometimes you may want (or have) to explicitly
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   708
select a particular overload variant.</p>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   709
<pre><code>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   710
// <a href="source/overload.js">overload.js</a>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   711
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   712
var out = java.lang.System.out;
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   713
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   714
// select a particular print function 
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   715
out["println(java.lang.Object)"]("hello");
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   716
</code>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   717
</pre>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   718
<hr>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   719
<a name="engineimpl" id="engineimpl"></a>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   720
<h2>Implementing Your Own Script Engine</h2>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   721
<p>We will not cover implementation of JSR-223 compliant script
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   722
engines in detail. Minimally, you need to implement the
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   723
<code>javax.script.ScriptEngine</code> and
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   724
<code>javax.script.ScriptEngineFactory</code> interfaces. The
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   725
abstract class <code>javax.script.AbstractScriptEngine</code>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   726
provides useful defaults for a few methods of the
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   727
<code>ScriptEngine</code> interface.</p>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   728
<p>Before starting to implement a JSR-223 engine, you may want to
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   729
check <a href="http://java.net/projects/Scripting">http://java.net/projects/Scripting</a>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   730
project. This project maintains JSR-223 implementations for many
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   731
popular open source scripting languages.</p>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   732
<hr>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   733
<a name="refs" id="refs"></a>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   734
<h2>References</h2>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   735
<ul>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   736
<li><a href="http://jcp.org/en/jsr/detail?id=223">JSR-223 Scripting
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   737
for the Java Platform</a></li>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   738
<li><a href="http://java.net/projects/Scripting">http://java.net/projects/Scripting
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   739
</a></li>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   740
</ul>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   741
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   742
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   743
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   744
<div class="hr"><hr></div>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   745
<table summary="layout" border="0" width="100%">
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   746
<tbody><tr valign="TOP">
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   747
<td width="30%"> <img src="Java%20Scripting%20Programmer%27s%20Guide_files/logo_oracle_footer.gif" alt="Oracle and/or its affiliates" border="0" height="29" width="100"><br>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   748
<font size="+1"> <i>Java Technology</i></font> </td>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   749
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   750
<td width="30%">
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   751
<p><font size="-2">
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   752
<a href="http://docs.oracle.com/javase/6/docs/legal/cpyr.html">Copyright ©</a> 2013, Oracle and/or its affiliates. All rights reserved.
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   753
</font></p> 
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   754
</td>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   755
<td width="30%">
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   756
<p align="right"><font size="-2"><a href="http://download.oracle.com/javase/feedback.html">Contact Us</a></font></p><font size="-2">
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   757
</font></td>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   758
</tr>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   759
</tbody></table> 
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   760
<div class="hr"><hr></div>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   761
</div>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   762
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   763
<!-- Start SiteCatalyst code   -->
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   764
<script language="JavaScript" src="Java%20Scripting%20Programmer%27s%20Guide_files/s_code_download.js"></script>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   765
<script language="JavaScript" src="Java%20Scripting%20Programmer%27s%20Guide_files/s_code.js"></script>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   766
 
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   767
<!-- ********** DO NOT ALTER ANYTHING BELOW THIS LINE ! *********** -->
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   768
<!--  Below code will send the info to Omniture server -->
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   769
<script language="javascript">var s_code=s.t();if(s_code)document.write(s_code)</script>
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   770
 
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   771
<!-- End SiteCatalyst code -->
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   772
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   773
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   774
363737d0d757 8007452: add scripting programmers doc changes for nashorn
sundar
parents:
diff changeset
   775
</body></html>