Java 스크립팅API누구를 위한 것인가요?
스크립팅 언어의 몇 가지 유용한 기능은 다음과 같습니다.
편의성: 대부분의 스크립트 언어는 동적으로 유형이 지정됩니다. 일반적으로 변수 유형을 선언하지 않고 새 변수를 생성할 수 있으며, 변수를 재사용하여 다양한 유형의 개체를 저장할 수 있습니다. 또한 스크립트 언어는 필요할 때 숫자 10을 "10"으로 변환하는 등 다양한 유형의 변환을 자동으로 수행하는 경향이 있습니다.
신속한 프로토타입 개발: 편집 컴파일 실행 주기를 피하고 "편집 실행"만 사용할 수 있습니다!
애플리케이션 확장/사용자 정의: 일부 구성 스크립트, 비즈니스 논리/규칙, 금융 애플리케이션의 수학적 표현과 같은 애플리케이션의 일부를 "구체화"할 수 있습니다.
디버깅, 런타임 구성/배포 시간을 위해 애플리케이션에 명령줄 모드를 추가합니다. 요즘 대부분의 애플리케이션에는 웹 기반 GUI 구성 도구가 있습니다. 그러나 시스템 관리자/배포자는 종종 명령줄 도구를 선호합니다. 임시 스크립트 언어를 개발하는 대신 "표준" 스크립트 언어를 이러한 목적으로 사용할 수 있습니다.
Java Script API는 Java 코드의 스크립팅 엔진을 사용하는 프레임워크 독립적인 스크립팅 언어입니다. Java 스크립팅 API를 통해 Java 언어를 사용하여 사용자 정의/확장 가능한 애플리케이션을 작성하고 사용자 정의 스크립팅 언어 선택을 최종 사용자에게 맡길 수 있습니다. Java 애플리케이션 개발자는 개발 중에 확장 언어를 선택할 필요가 없습니다. JSR-223 API를 사용하여 애플리케이션을 작성하는 경우 사용자는 JSR-223 호환 스크립트 언어를 사용할 수 있습니다.
스크립트 패키지
Java 스크립트 기능은 javax.script 패키지에 있습니다. 이는 비교적 작고 간단한 API입니다. 스크립트의 시작점은 ScriptEngineManager 클래스입니다. ScriptEngineManager 개체는 jar 파일의 서비스 검색 메커니즘을 통해 스크립트 엔진을 검색할 수 있습니다. 또한 특정 스크립트 언어로 작성된 스크립트를 해석하기 위해 스크립트 엔진을 인스턴스화할 수도 있습니다. 스크립팅 인터페이스를 사용하는 가장 간단한 방법은 다음과 같습니다.
ScriptEngineManager
개체 만들기ScriptEngineManager 개체 가져오기 🎜>
ScriptEngine
ScriptEngine的eval方法执行脚本
JavaScript를 아는 것이 도움이 되지만 이 예제를 읽을 때 필수는 아닙니다.
인스턴스"Hello, World"ScriptEngineManager 인스턴스에서 메소드를 통해 JavaScript 엔진 인스턴스를 얻습니다. 스크립트 엔진의 eval 메소드를 통해 주어진 JavaScript 코드를 실행합니다. 단순화를 위해 이 예제와 후속 예제에서는 예외를 처리하지 않습니다. javax.script API에는 검사 및 런타임 예외가 있으므로 예외를 적절하게 처리해야 합니다. getEngineByName
import javax.script.*; public class EvalScript { public static void main(String[] args) throws Exception { // create a script engine manager ScriptEngineManager factory = new ScriptEngineManager(); // create a JavaScript engine ScriptEngine engine = factory.getEngineByName("JavaScript"); // evaluate JavaScript code from String engine.eval("print('Hello, World')"); } }스크립트 파일 실행이 예에서는 eval 메소드를 호출하여 java.io.Reader를 입력 소스로 받습니다. 읽기 스크립트가 실행됩니다. 이 메소드는 스크립트를 파일로 실행하고 관련 입력 스트림 객체를 사용하여 URL과 리소스를 읽을 수 있습니다.
import javax.script.*; public class EvalFile { public static void main(String[] args) throws Exception { // create a script engine manager ScriptEngineManager factory = new ScriptEngineManager(); // create JavaScript engine ScriptEngine engine = factory.getEngineByName("JavaScript"); // evaluate JavaScript code from given file - specified by first argument engine.eval(new java.io.FileReader(args[0])); } }다음 내용이 포함된 "test.js"라는 파일이 있다고 가정합니다.
println("This is hello from test.js");다음 방법을 사용하여 지금 바로 스크립트를 실행할 수 있습니다
java EvalFile test.js스크립트 변수 Java 애플리케이션에 스크립팅 엔진과 스크립트가 포함된 경우 애플리케이션 객체를 전역 변수로 스크립트에 노출할 수 있습니다. 이 예에서는 애플리케이션 개체를 전역 변수로 스크립트에 노출하는 방법을 보여줍니다. 우리는 file이라는 이름을 사용하여 애플리케이션에서 전역 변수로 java.io.File 객체를 생성합니다. 스크립트는 변수에 액세스할 수 있습니다. 예를 들어 공개 메서드를 호출할 수 있습니다. Java 객체, 필드 및 메소드에 액세스하기 위한 구문은 스크립팅 언어에 따라 다릅니다. JavaScript는 가장 "자연스러운" Java와 유사한 구문을 지원합니다.
public class ScriptVars { public static void main(String[] args) throws Exception { ScriptEngineManager manager = new ScriptEngineManager(); ScriptEngine engine = manager.getEngineByName("JavaScript"); File f = new File("test.txt"); // expose File object as variable to script engine.put("file", f); // evaluate a script string. The script accesses "file" // variable and calls method on it engine.eval("print(file.getAbsolutePath())"); } }스크립트 호출
함수및 메서드
때때로 특정 스크립트 함수를 여러 번 호출해야 할 수도 있습니다. 예를 들어 애플리케이션 메뉴 기능은 다음과 같이 구현될 수 있습니다. 스크립트 . 메뉴의이벤트 처리 프로그램 작업에서 특정 스크립트 함수를 호출해야 할 수도 있습니다. 다음 예에서는 Java 코드에서 특정 스크립트를 호출하는 방법을 보여줍니다.
import javax.script.*; public class InvokeScriptFunction { public static void main(String[] args) throws Exception { ScriptEngineManager manager = new ScriptEngineManager(); ScriptEngine engine = manager.getEngineByName("JavaScript"); // JavaScript code in a String String script = "function hello(name) { print('Hello, ' + name); }"; // evaluate script engine.eval(script); // javax.script.Invocable is an optional interface. // Check whether your script engine implements or not! // Note that the JavaScript engine implements Invocable interface. Invocable inv = (Invocable) engine; // invoke the global function named "hello" inv.invokeFunction("hello", "Scripting!!" ); } }스크립트 언어가 객체 기반(예: JavaScript)이거나
객체 지향인 경우 스크립트 객체에서 스크립트 메소드를 호출할 수 있습니다.
import javax.script.*; public class InvokeScriptMethod { public static void main(String[] args) throws Exception { ScriptEngineManager manager = new ScriptEngineManager(); ScriptEngine engine = manager.getEngineByName("JavaScript"); // JavaScript code in a String. This code defines a script object 'obj' // with one method called 'hello'. String script = "var obj = new Object(); obj.hello = function(name) { print('Hello, ' + name); }"; // evaluate script engine.eval(script); // javax.script.Invocable is an optional interface. // Check whether your script engine implements or not! // Note that the JavaScript engine implements Invocable interface. Invocable inv = (Invocable) engine; // get script object on which we want to call the method Object obj = engine.get("obj"); // invoke the method named "hello" on the script object "obj" inv.invokeMethod(obj, "hello", "Script Method !!" ); } }스크립트를 통해 Java 인터페이스 구현때로는 Java에서 호출하는 대신 스크립트 함수나 메소드를 통해 Java 인터페이스를 구현하는 것이 편리할 수 있습니다. 동시에 인터페이스를 통해 여러 곳에서 javax.script API 인터페이스 사용을 피할 수 있습니다. 인터페이스 구현자 객체를 가져와서 이를 다른 Java API에 전달할 수 있습니다. 다음 예에서는 스크립트를 통해 java.lang.Runnable 인터페이스를 구현하는 방법을 보여줍니다.
import javax.script.*; public class RunnableImpl { public static void main(String[] args) throws Exception { ScriptEngineManager manager = new ScriptEngineManager(); ScriptEngine engine = manager.getEngineByName("JavaScript"); // JavaScript code in a String String script = "function run() { println('run called'); }"; // evaluate script engine.eval(script); Invocable inv = (Invocable) engine; // get Runnable interface object from engine. This interface methods // are implemented by script functions with the matching name. Runnable r = inv.getInterface(Runnable.class); // start a new thread that runs the script implemented // runnable interface Thread th = new Thread(r); th.start(); } }
如果你的脚本语言是基于对象或者面向对象的,可以通过脚本对象的脚本方法来实现Java接口。这避免了不得不调用脚本全局函数的接口方法。脚本对象可以存储接口实现状态。
import javax.script.*; public class RunnableImplObject { public static void main(String[] args) throws Exception { ScriptEngineManager manager = new ScriptEngineManager(); ScriptEngine engine = manager.getEngineByName("JavaScript"); // JavaScript code in a String String script = "var obj = new Object(); obj.run = function() { println('run method called'); }"; // evaluate script engine.eval(script); // get script object on which we want to implement the interface with Object obj = engine.get("obj"); Invocable inv = (Invocable) engine; // get Runnable interface object from engine. This interface methods // are implemented by script methods of object 'obj' Runnable r = inv.getInterface(obj, Runnable.class); // start a new thread that runs the script implemented // runnable interface Thread th = new Thread(r); th.start(); } }
脚本的多作用域
在 script variables 例子中,我们看到怎样将应用对象暴露为脚本的全局变量。它有可能暴露为多个全局的作用域 。 单作用域是javax.script.Bindings的实例中
. 这个借口派生至java.util.Map<string object>。</string>
scope 键值对的集合,其中键为非空、非空字符串。 多scopes 是 javax.script.ScriptContext
接口支持的。支持一个或多个脚本上下文与相关的域绑定。默认情况下, 每一个脚本引擎都有一个默认的脚本上下文。 默认的脚本上下文有至少一个域叫 ”ENGINE_SCOPE”。不同域的脚本上下文支持可以通过 getscopes 方法获取。
import javax.script.*; public class MultiScopes { public static void main(String[] args) throws Exception { ScriptEngineManager manager = new ScriptEngineManager(); ScriptEngine engine = manager.getEngineByName("JavaScript"); engine.put("x", "hello"); // print global variable "x" engine.eval("println(x);"); // the above line prints "hello" // Now, pass a different script context ScriptContext newContext = new SimpleScriptContext(); Bindings engineScope = newContext.getBindings(ScriptContext.ENGINE_SCOPE); // add new variable "x" to the new engineScope engineScope.put("x", "world"); // execute the same script - but this time pass a different script context engine.eval("println(x);", newContext); // the above line prints "world" } }
JavaScript 脚本引擎
Sun的JDK 6中包含了一个基于 Mozilla Rhino JavaScript 脚本引擎。 这个引擎是基于版本为1.6R2的Mozilla Rhino 。多数 Rhino 实现都被包含在内。少部分组件由于大小和安全原因被排除了:
JavaScript转字节码编译 (也称 ”优化器”).。此功能依赖一个类生成库。 去掉本功能意味着:JavaScript是解释执行,且不影响脚本执行,因为优化器是透明的。
-
Rhino的JavaAdapter 也被去掉了。 JavaAdapter是一个JavaScript可扩展Java类和JavaScript可实现Java接口功能。此功能也是需要类生成库的。我们把Rhino的JavaAdapter替换为Sun实现的JavaAdapter。在Sun的实现中,仅仅实现了JavaScript对象可实现Java单接口功能。例如,下面的代码会正确执行。
var v = new java.lang.Runnable() { run: function() { print('hello'); } } v.run();
在大多数情况下,JavaAdapter是采用匿名类语法来实现单接口。 使用JavaAdapter来扩展Java类或实现多接口并不常见。
E4X (ECMAScript for XML – ECMA Standard 357) 被去掉了. 使用XML JavaScript代码会产生一个语法错误. 请注意,E4X支持ECMAScript标准是可选的-省略E4X的实现是被支持也是兼容 ECMAScript 。
Rhino的命令行工具 (Rhino shell, debugger 等) 没有被包含在内。但你可以用使用 jrunscript来代替。
JavaScript与Java的通信
在大多数情况下,访问Java类、对象和方法很简单。从JavaScript中访问属性和方法与同Java中一样。这里,我们突出JavaScript Java访问的重要方面.。下面是一些JavaScript访问Java的代码片段。本节需要一些JavaScript知识。如果你打算使用JSR-223中非JavaScript脚本语言,那么本节可以跳过。
引入Java 包, 类
内置的函数importPackage
和importClass
可以用于引入Java 包和类。
// Import Java packages and classes // like import package.*; in Java importPackage(java.awt); // like import java.awt.Frame in Java importClass(java.awt.Frame); // Create Java Objects by "new ClassName" var frame = new java.awt.Frame("hello"); // Call Java public methods from script frame.setVisible(true); // Access "JavaBean" properties like "fields" print(frame.title);
全局变量Packages也可以用于访问Java包。例如: Packages.java.util.Vector
, Packages.javax.swing.JFrame
. 请注意: ”java” 是 “Packages.java”的快捷引用。还有一些等价的快捷引用前缀 : javax, org, edu, com, net, 所以几乎所有的 JDK 平台下的类都可以不使用”Packages” 前缀而访问到。
请注意,java.lang不是默认引入的 (与Java不同),因为会与 JavaScript’s 内置的 Object, Boolean, Math 等冲突。
importPackage
和importClass
函数”污染” 了JavaScript中的全局变量。为了避免这种情况,你可以使用JavaImporter。
// create JavaImporter with specific packages and classes to import var SwingGui = new JavaImporter(javax.swing, javax.swing.event, javax.swing.border, java.awt.event); with (SwingGui) { // within this 'with' statement, we can access Swing and AWT // classes by unqualified (simple) names. var mybutton = new JButton("test"); var myframe = new JFrame("test"); }
C创建和使用Java的数组
在JavaScript中,创建一个对象时与Java中一样,而创建Java数组时需要显式的使用Java反射。但一旦创建好后,访问其中的元素或获取大小就和Java中一样。 另外,也可以使用脚本数组用在Java方法中期望的Java数组(因为可以自动转换)。所以在大多数情况下我们不需要显式地创建Java数组。
// create Java String array of 5 elements var a = java.lang.reflect.Array.newInstance(java.lang.String, 5); // Accessing elements and length access is by usual Java syntax a[0] = "scripting is great!"; print(a.length);
实现Java 接口
在JavaScript中,可以使用Java匿名类语法形式实现Java中接口:
var r = new java.lang.Runnable() { run: function() { print("running...\n"); } }; // "r" can be passed to Java methods that expect java.lang.Runnable var th = new java.lang.Thread(r); th.start();
当接口中只有一个需要实现的方法时,你可以自己传入脚本的函数(因为可以自动转换)。
function func() { print("I am func!"); } // pass script function for java.lang.Runnable argument var th = new java.lang.Thread(func); th.start();
重载
Java方法是使用参数类型重载的。在Java中,重载发生在编译阶段 (执行 javac)。当脚本中调用Java方法时,脚本的翻译器或编译器需要选择适当的方法。对于JavaScript引擎,您不需要做任何特别的——正确的Java方法重载变体是根据参数类型选择的。 但有时,您可能希望(或有)显式地选择一个特定的过载变体。
var out = java.lang.System.out; // select a particular println function out["println(java.lang.Object)"]("hello");
自定义脚本引擎
我们不会覆盖的JSR-223兼容脚本引擎实现细节. 至少, 您需要实现javax.script.ScriptEngine
和javax.script.ScriptEngineFactory
接口。 抽象类javax.script.AbstractScriptEngine
提供了一些ScriptEngine
接口中定义的方法。
在开始实现 JSR-223 引擎之前,您可能需要下载。这个工程维护了一些流行的开源脚本语言的 JSR-223 实现。
위 내용은 Java 스크립트 프로그래밍 가이드의 코드 예제 공유의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

이 기사에서는 Java 프로젝트 관리, 구축 자동화 및 종속성 해상도에 Maven 및 Gradle을 사용하여 접근 방식과 최적화 전략을 비교합니다.

이 기사에서는 Maven 및 Gradle과 같은 도구를 사용하여 적절한 버전 및 종속성 관리로 사용자 정의 Java 라이브러리 (JAR Files)를 작성하고 사용하는 것에 대해 설명합니다.

이 기사는 카페인 및 구아바 캐시를 사용하여 자바에서 다단계 캐싱을 구현하여 응용 프로그램 성능을 향상시키는 것에 대해 설명합니다. 구성 및 퇴거 정책 관리 Best Pra와 함께 설정, 통합 및 성능 이점을 다룹니다.

이 기사는 캐싱 및 게으른 하중과 같은 고급 기능을 사용하여 객체 관계 매핑에 JPA를 사용하는 것에 대해 설명합니다. 잠재적 인 함정을 강조하면서 성능을 최적화하기위한 설정, 엔티티 매핑 및 모범 사례를 다룹니다. [159 문자]

Java의 클래스 로딩에는 부트 스트랩, 확장 및 응용 프로그램 클래스 로더가있는 계층 적 시스템을 사용하여 클래스로드, 링크 및 초기화 클래스가 포함됩니다. 학부모 위임 모델은 핵심 클래스가 먼저로드되어 사용자 정의 클래스 LOA에 영향을 미치도록합니다.


핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

드림위버 CS6
시각적 웹 개발 도구

안전한 시험 브라우저
안전한 시험 브라우저는 온라인 시험을 안전하게 치르기 위한 보안 브라우저 환경입니다. 이 소프트웨어는 모든 컴퓨터를 안전한 워크스테이션으로 바꿔줍니다. 이는 모든 유틸리티에 대한 액세스를 제어하고 학생들이 승인되지 않은 리소스를 사용하는 것을 방지합니다.

에디트플러스 중국어 크랙 버전
작은 크기, 구문 강조, 코드 프롬프트 기능을 지원하지 않음

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

WebStorm Mac 버전
유용한 JavaScript 개발 도구
