学习资料
http://jnotnull.iteye.com/blog/262384
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.Map.Entry;
import javax.script.Invocable;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
import sun.org.mozilla.javascript.internal.NativeArray;
import sun.org.mozilla.javascript.internal.NativeObject;
public class TestScript {
public static void main(String[] args) throws Exception {
ScriptEngineManager factory = new ScriptEngineManager();
ScriptEngine engine = factory.getEngineByName("JavaScript");
// engine.eval("print('hello')");
// testScriptVariables(engine);// 演示如何暴露Java对象为脚本语言的全局变量
// testInvokeScriptMethod(engine);// 演示如何在Java中调用脚本语言的方法
// testScriptInterface(engine);// 演示脚本语言如何实现Java的接口
// testUsingJDKClasses(engine);// 演示脚本语言如何使用JDK平台下的类
test(engine);
}
public static void testScriptVariables(ScriptEngine engine)
throws ScriptException {
Map<String, Object> map = new HashMap<String, Object>();
engine.put("map", map);
engine.eval("map.put('s',new Date);");
System.out.println(map.get("s").getClass());
}
public static void testInvokeScriptMethod(ScriptEngine engine)
throws Exception {
String script = "function hello(name) { return 'Hello,' + name;}";
engine.eval(script);
Invocable inv = (Invocable) engine;
String res = (String) inv.invokeFunction("hello", "Scripting");
System.out.println("res:" + res);
}
public static void testScriptInterface(ScriptEngine engine)
throws ScriptException {
String script = "var obj = new Object();obj.run = function() { println('run method called');}";
engine.eval(script);
Object obj = engine.get("obj");
Invocable inv = (Invocable) engine;
Runnable r = inv.getInterface(obj, Runnable.class);
Thread th = new Thread(r);
th.start();
}
public static void testUsingJDKClasses(ScriptEngine engine)
throws Exception {
// Packages是脚本语言里的一个全局变量,专用于访问JDK的package
// String js = "function doSwing(t){var f=new
// Packages.javax.swing.JFrame(t);f.setSize(400,300);f.setVisible(true);}";
String js = "function doSwing(t){var f=Packages.java.util.UUID.randomUUID();print(f)}";
engine.eval(js);
Invocable inv = (Invocable) engine;
inv.invokeFunction("doSwing", "Scripting Swing");
}
/**
* 我能想到的应用场景,将前台传过来的json数组构造成java的List<Map<String,
* Object>>,然后就可以随心所欲的使用该list了 当然可以使用第三方jar采用json to
* bean的方式,而且这种方案更优雅,但是需要引入第三方库
*
* @throws NoSuchMethodException
* @throws ScriptException
*/
public static void test(ScriptEngine engine) throws ScriptException,
NoSuchMethodException {
// String json =
// "{'key1':'a','son':{'dd':'dd','a':8},'ran':Math.random()},{'key3':'xor'}";
String json = "{'key1':'a','son':[{'dd':'dd'},{'dd1':'dd1'}],'ran':Math.random()},{'key3':'xor'}";
NativeArray json2array = json2array(engine, "[" + json + "]");
List<Map<String, Object>> list = array2list(engine, json2array);
System.out.println(list);
}
public static NativeArray json2array(ScriptEngine engine, String json)
throws ScriptException, NoSuchMethodException {
String script = "function hello() { return " + json + ";}";
engine.eval(script);
Invocable inv = (Invocable) engine;
Object obj = inv.invokeFunction("hello");
// System.out.println(obj);
return (NativeArray) obj;
}
public static List<Map<String, Object>> array2list(ScriptEngine engine,
NativeArray nativeArray) throws ScriptException,
NoSuchMethodException {
List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
engine.put("list", list);
engine.put("arr", nativeArray);
String script = " function dosomething(){ "
+ " "
+ " for (n=0; n< arr.length; n++){ "
+ " var map=new Packages.java.util.HashMap(); "
+ " for (i in arr[n]){ "
+ " map.put(i,arr[n][i]); "
+ " } " + " list.add(map); "
+ " } " + " } ";
engine.eval(script);
Invocable inv = (Invocable) engine;
inv.invokeFunction("dosomething");
for (Map<String, Object> map : list) {
Set<Entry<String, Object>> entrySet = map.entrySet();
for (Entry<String, Object> entry : entrySet) {
Object object = entry.getValue();
if (object instanceof NativeArray) {
map.put(entry.getKey(), array2list(engine,
(NativeArray) object));
} else if (object instanceof NativeObject) {
map.put(entry.getKey(), obj2map(engine,
(NativeObject) object));
}
}
}
return list;
}
public static Map<String, Object> obj2map(ScriptEngine engine,
Object nativeObject) throws ScriptException, NoSuchMethodException {
Map<String, Object> map = new HashMap<String, Object>();
engine.put("map", map);
engine.put("obj", nativeObject);
String script = " function dosomething(){ "
+ " for (i in obj){ "
+ " map.put(i,obj[i]); "
+ " } " + " } ";
engine.eval(script);
Invocable inv = (Invocable) engine;
inv.invokeFunction("dosomething");
return map;
}
}
分享到:
相关推荐
标题和描述中提到的“Java执行JavaScript代码”指向了一个特定的技术范畴,即在Java环境中执行JavaScript代码。这通常涉及到使用Java中的脚本引擎API,特别是那些支持JavaScript的实现。从提供的部分内容中可以提炼...
Java执行JavaScript代码是一种常见的跨语言交互场景,尤其是在服务器端应用中,例如集成第三方JavaScript库或者在Java应用中利用JavaScript的灵活性。以下将详细介绍如何在Java中执行JavaScript代码,并结合提供的...
标题中的“Java调用JavaScript代码”是指在Java程序中执行JavaScript脚本,实现跨语言通信。这主要通过Java的ScriptEngine接口和其相关的API来实现,这些API位于Java的javax.script包中。ScriptEngine接口提供了执行...
以下是一个简单的示例,展示如何使用Nashorn引擎在Java中运行JavaScript代码: ```java import javax.script.Invocable; import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; public ...
Java混淆和加密JavaScript代码是保护Web应用程序源代码安全的重要...在Java中运行混淆和加密后的JavaScript代码,可以通过Java的脚本引擎实现。这个压缩包提供的资源可以帮助开发者实现这些功能,确保Web应用的安全。
1. **快速执行**:Rhino是用Java实现的,因此它可以充分利用Java的性能优势,尤其是在处理大量JavaScript代码时,其执行速度较快。 2. **JavaScript到Java的互操作性**:Rhino允许JavaScript代码直接调用Java对象和...
该项目展示了如何在Java代码中使用GraalVM的`ScriptEngine` API来执行JavaScript代码。例如,你可以创建一个`ScriptEngineManager`实例,然后通过它获取`GraalJS`引擎,并执行JavaScript脚本。Java代码可以像这样与...
这些文件可以直接运行,用于演示如何在Java和JavaScript之间进行DES加密解密。通过查看和理解这些代码,你可以更好地了解如何在实际项目中应用这一技术。 6. **安全注意事项**: 虽然DES在某些场景下仍可用,但它...
- 性能:由于语言特性的差异,转换后的JavaScript代码可能不如原生JavaScript代码执行效率高。 综上所述,"java转js工具"是一个重要的开发辅助工具,它帮助开发者在Java和JavaScript之间架起桥梁,使得跨平台开发...
2. **Nashorn JavaScript引擎**:Java 8引入了Nashorn JavaScript引擎,可以直接在JVM(Java虚拟机)中运行JavaScript代码。Java可以通过`javax.script`包中的接口与JavaScript交互,允许在Java程序中执行JavaScript...
JSMinifier是一款基于Java的JavaScript代码压缩工具,它可以有效地减少JavaScript文件的体积。由于它是Java应用程序,因此在使用前需要确保你的系统已经安装了Java运行环境(JRE)。如果你还没有安装,可以从Oracle...
Nashorn是Java 8引入的一个内置JavaScript引擎,它允许Java开发者在Java环境中执行JavaScript代码,实现了JavaScript与Java的无缝集成。Nashorn引擎基于Mozilla的Rhino引擎,但提供了更快的性能和更现代的ECMAScript...
- **WebView**: Android提供了WebView组件,可以加载和执行JavaScript代码。通过`WebView.loadUrl("javascript:...")`或`WebView.addJavascriptInterface()`方法,可以让Java代码和JavaScript进行交互。 - **Rhino...
- **Java转JavaScript**: 这一过程涉及到的技术主要是指如何将原本基于Java语言编写的代码转换为能够在浏览器环境中运行的JavaScript代码。这项技术对于希望利用Java的强大特性和广泛的库资源来构建前端Web应用的...
- 一个HTML文件,内含JavaScript代码,用于调用Java接口和接收Java的回调。 - 可能还有其他辅助类或资源文件,帮助演示完整的交互流程。 这个Demo将帮助开发者理解如何在Android应用中实现在JS和Java之间进行有效...
这些代码可能包括JavaScript和Java两部分,分别展示了如何初始化密钥、执行加密和解密操作,并确保结果在两个环境间一致。为了确保互操作,开发者可能需要进行一些额外的步骤,比如在JavaScript中使用Base64编码将二...
Java调用Javascript的技术涉及了在Java Applet中通过脚本接口与Web页面上的JavaScript代码进行交互。这部分技术在当前的Web开发中已较少使用,因为Java Applet的安全性问题和浏览器的兼容性问题,使得现代浏览器逐渐...
- **通过JSP脚本元素**:在JSP中,可以使用 `<script>` 标签直接输出JavaScript代码,将Java变量的值传递给JavaScript。例如: ```jsp var myValue = "<%= javaVariable %>"; ``` - **通过JSP表达式语言...
它的设计目标是“一次编写,到处运行”,这意味着Java代码可以在各种平台之间无缝移植。Java广泛应用于企业级应用开发、服务器端编程、移动应用(尤其是Android平台)、大数据处理以及云计算等领域。Java的特点包括...