1 /* 2 * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. Oracle designates this 8 * particular file as subject to the "Classpath" exception as provided 9 * by Oracle in the LICENSE file that accompanied this code. 10 * 11 * This code is distributed in the hope that it will be useful, but WITHOUT 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 * version 2 for more details (a copy is included in the LICENSE file that 15 * accompanied this code). 16 * 17 * You should have received a copy of the GNU General Public License version 18 * 2 along with this work; if not, write to the Free Software Foundation, 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 * 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 * or visit www.oracle.com if you need additional information or have any 23 * questions. 24 */ 25 26 /** 27 * Provides the implementation of Nashorn script engine and 28 * the runtime environment for programs written in ECMAScript 5.1. 29 * <p> 30 * Nashorn is a runtime environment for programs written in ECMAScript 5.1. 31 * </p> 32 * 33 * <h1>Usage</h1> 34 * 35 * The recommended way to use Nashorn is through the 36 * <a href="http://jcp.org/en/jsr/detail?id=223" target="_top">JSR-223 37 * "Scripting for the Java Platform"</a> APIs found in the 38 * {@link javax.script} package. Usually, you'll obtain a 39 * {@link javax.script.ScriptEngine} instance for Nashorn using: 40 * <pre> 41 import javax.script.*; 42 ... 43 ScriptEngine nashornEngine = new ScriptEngineManager().getEngineByName("nashorn"); 44 </pre> 45 * 46 * and then use it just as you would any other JSR-223 script engine. See 47 * <a href="jdk/nashorn/api/scripting/package-summary.html"> 48 * {@code jdk.nashorn.api.scripting}</a> package for details. 49 * <h1>Compatibility</h1> 50 * Nashorn is 100% compliant with the 51 * <a href="http://www.ecma-international.org/publications/standards/Ecma-262.htm" 52 * target="_top">ECMA-262 Standard, Edition 5.1</a>. 53 * It requires a Java Virtual Machine that implements the 54 * <a href="http://jcp.org/en/jsr/detail?id=292" target="_top"> 55 * JSR-292 "Supporting Dynamically Typed Languages on the Java Platform"</a> 56 * specification (often referred to as "invokedynamic"), as well as 57 * the already mentioned JSR-223. 58 * 59 * <h1>Interoperability with the Java platform</h1> 60 * 61 * In addition to being a 100% ECMAScript 5.1 runtime, Nashorn provides features 62 * for interoperability of the ECMAScript programs with the Java platform. 63 * In general, any Java object put into the script engine's context will be 64 * visible from the script. In terms of the standard, such Java objects are not 65 * considered "native objects", but rather "host objects", as defined in 66 * section 4.3.8. This distinction allows certain semantical differences 67 * in handling them compared to native objects. For most purposes, Java objects 68 * behave just as native objects do: you can invoke their methods, get and set 69 * their properties. In most cases, though, you can't add arbitrary properties 70 * to them, nor can you remove existing properties. 71 * 72 * <h2>Java collection handling</h2> 73 * 74 * Native Java arrays and {@link java.util.List}s support indexed access to 75 * their elements through the property accessors, and {@link java.util.Map}s 76 * support both property and element access through both dot and square-bracket 77 * property accessors, with the difference being that dot operator gives 78 * precedence to object properties (its fields and properties defined as 79 * {@code getXxx} and {@code setXxx} methods) while the square bracket 80 * operator gives precedence to map elements. Native Java arrays expose 81 * the {@code length} property. 82 * 83 * <h2>ECMAScript primitive types</h2> 84 * 85 * ECMAScript primitive types for number, string, and boolean are represented 86 * with {@link java.lang.Number}, {@link java.lang.CharSequence}, and 87 * {@link java.lang.Boolean} objects. While the most often used number type 88 * is {@link java.lang.Double} and the most often used string type is 89 * {@link java.lang.String}, don't rely on it as various internal optimizations 90 * cause other subclasses of {@code Number} and internal implementations of 91 * {@code CharSequence} to be used. 92 * 93 * <h2>Type conversions</h2> 94 * 95 * When a method on a Java object is invoked, the arguments are converted to 96 * the formal parameter types of the Java method using all allowed ECMAScript 97 * conversions. This can be surprising, as in general, conversions from string 98 * to number will succeed according to Standard's section 9.3 "ToNumber" 99 * and so on; string to boolean, number to boolean, Object to number, 100 * Object to string all work. Note that if the Java method's declared parameter 101 * type is {@code java.lang.Object}, Nashorn objects are passed without any 102 * conversion whatsoever; specifically if the JavaScript value being passed 103 * is of primitive string type, you can only rely on it being a 104 * {@code java.lang.CharSequence}, and if the value is a number, you can only 105 * rely on it being a {@code java.lang.Number}. If the Java method declared 106 * parameter type is more specific (e.g. {@code java.lang.String} or 107 * {@code java.lang.Double}), then Nashorn will of course ensure 108 * the required type is passed. 109 * 110 * <h2>SAM types</h2> 111 * 112 * As a special extension when invoking Java methods, ECMAScript function 113 * objects can be passed in place of an argument whose Java type is so-called 114 * "single abstract method" or "SAM" type. While this name usually covers 115 * single-method interfaces, Nashorn is a bit more versatile, and it 116 * recognizes a type as a SAM type if all its abstract methods are 117 * overloads of the same name, and it is either an interface, or it is an 118 * abstract class with a no-arg constructor. The type itself must be public, 119 * while the constructor and the methods can be either public or protected. 120 * If there are multiple abstract overloads of the same name, the single 121 * function will serve as the shared implementation for all of them, 122 * <em>and additionally it will also override any non-abstract methods of 123 * the same name</em>. This is done to be consistent with the fact that 124 * ECMAScript does not have the concept of overloaded methods. 125 * 126 * <h2>The {@code Java} object</h2> 127 * 128 * Nashorn exposes a non-standard global object named {@code Java} that is 129 * the primary API entry point into Java platform-specific functionality. 130 * You can use it to create instances of Java classes, convert from Java arrays 131 * to native arrays and back, and so on. 132 * 133 * <h2>Other non-standard built-in objects</h2> 134 * 135 * In addition to {@code Java}, Nashorn also exposes some other 136 * non-standard built-in objects: 137 * {@code JSAdapter}, {@code JavaImporter}, {@code Packages} 138 * 139 * @provides javax.script.ScriptEngineFactory 140 * @moduleGraph 141 * @since 9 142 */ 143 module jdk.scripting.nashorn { 144 requires java.logging; 145 requires transitive java.scripting; 146 requires jdk.dynalink; 147 148 exports jdk.nashorn.api.scripting; 149 exports jdk.nashorn.api.tree; 150 151 exports jdk.nashorn.internal.runtime to 152 jdk.scripting.nashorn.shell; 153 exports jdk.nashorn.internal.objects to 154 jdk.scripting.nashorn.shell; 155 exports jdk.nashorn.tools to 156 jdk.scripting.nashorn.shell; 157 158 provides javax.script.ScriptEngineFactory 159 with jdk.nashorn.api.scripting.NashornScriptEngineFactory; 160 161 provides jdk.dynalink.linker.GuardingDynamicLinkerExporter 162 with jdk.nashorn.api.linker.NashornLinkerExporter; 163 }