国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【技巧】ScriptEngine--Java動態(tài)執(zhí)行JS Javascript腳本(可調用java的方法)

這篇具有很好參考價值的文章主要介紹了【技巧】ScriptEngine--Java動態(tài)執(zhí)行JS Javascript腳本(可調用java的方法)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

【技巧】ScriptEngine--Java動態(tài)執(zhí)行JS Javascript腳本(可調用java的方法) 擴展性很強

JS引擎Nashorn

開發(fā)手冊

Java Platform, Standard Edition Nashorn User's Guide, Release 14

用戶手冊

Nashorn User's Guide (oracle.com)

scriptengine,技巧心得,java,前端,開發(fā)語言,javascript

https://docs.oracle.com/en/java/javase/14/nashorn/

甚至可以讓前端來寫后端業(yè)務代碼

可以通過js調用java的方法, 通過傳參的方式將java對象傳給js

可以單獨寫個JsUtil 讓js來調用 里邊寫常用的方法 統(tǒng)一管理

也可以直接通過Spring去拿到對應的實例

JDK9+ 需要單獨依賴

        <dependency>
            <groupId>commons-net</groupId>
            <artifactId>commons-net</artifactId>
            <version>3.6</version>
        </dependency>

相關工具類

        <!-- hutool工具類-->
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.8.20</version>
        </dependency>

代碼例子

package com.xx.study.Script.Javascript;

import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import cn.hutool.script.ScriptUtil;
import org.junit.jupiter.api.Test;

import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
import java.util.HashMap;
import java.util.Map;

public class JavascriptDemo {

    
    private final static String js = """
            
            function test(){
                var a = 1;
                var b = 3;
                return a+b;
            }
            function 加法(a, b){
                return a+b;
            }
            
            
            function MAP傳參(map){
            
                return map['a']+map['b'];
            }
            
            function 獲取json(){
                var json = {
                    最大值:10,
                    最小值:3,
                    說明:'測試js方法'
                };
                return JSON.stringify(json);
            }
            
            
            """;

    /**
     * 可以考慮結合業(yè)務做成動態(tài)參數(shù)等
     * 將js存到數(shù)據(jù)庫進行管理 也可以維護到redis緩存等
     * @param args
     */
    public static void main(String[] args) {

        Object test結果 = ScriptUtil.invoke(js, "test");

        System.out.println("test:================================");
        //4.0
        System.out.println(test結果);
        
        
        Object 加法結果 = ScriptUtil.invoke(js, "加法", 100, 200);
        System.out.println("加法:==============================");
        //300.0
        System.out.println(加法結果);
        
        
        Map<String, Integer> MAP參數(shù) = new HashMap<>();
        MAP參數(shù).put("a", 500);
        MAP參數(shù).put("b", 500);
        Object MAP傳參結果 = ScriptUtil.invoke(js, "MAP傳參", MAP參數(shù));

        System.out.println("MAP傳參:======================================");
        //1000.0
        System.out.println(MAP傳參結果);
        
        
        Object 獲取json結果 = ScriptUtil.invoke(js, "獲取json");
        JSONObject entries = JSONUtil.parseObj(獲取json結果.toString());

        System.out.println("獲取json:======================================");
        //10
        System.out.println(entries.getInt("最大值"));
        //測試js方法
        System.out.println(entries.getStr("說明"));
        //{"最大值":10,"最小值":3,"說明":"測試js方法"}
        System.out.println(entries);
        
    }


    /**
     * ScriptEngine.eval()
     */
    @Test
    public void jsEngineEvalTest() {
        ScriptEngineManager sem = new ScriptEngineManager();
        //查找并為給定的擴展創(chuàng)建ScriptEngine。也可用getEngineByName,查找并為給定名稱創(chuàng)建ScriptEngine 
        ScriptEngine jsEngine = sem.getEngineByExtension("js");
        try {
            jsEngine.eval("var array = [1, 2, 3, 4, 5];for (var i = 0; i < array.length; i++) {print('index:' + i + ',value:' + array[i]);}");
        } catch (ScriptException e) {
            e.printStackTrace();
        }
    }

}
    /**
     * ScriptEngine.eval()
     */
    @Test
    public void jsEngineEvalTest() {
        ScriptEngineManager sem = new ScriptEngineManager();
        //查找并為給定的擴展創(chuàng)建ScriptEngine。也可用getEngineByName,查找并為給定名稱創(chuàng)建ScriptEngine 
        ScriptEngine jsEngine = sem.getEngineByExtension("js");
        try {
            jsEngine.eval("var array = [1, 2, 3, 4, 5];for (var i = 0; i < array.length; i++) {print('index:' + i + ',value:' + array[i]);}");
        } catch (ScriptException e) {
            e.printStackTrace();
        }
    }

通過js創(chuàng)建java對象

jjs> var HashMap = Java.type("java.util.HashMap")
jjs> var mapDef = new HashMap()
jjs> var map100 = new HashMap(100)

訪問類和實例成員

jjs> Java.type("java.lang.Math").PI
3.141592653589793
jjs> Java.type("java.lang.System").currentTimeMillis()
1375813353330
jjs> Java.type("java.util.Map").Entry
[JavaClass java.util.Map$Entry]

內部類也可以使用內部表示來訪問,其中美元符號 () 作為分隔符或點,這與 Java 一致:$

jjs> Java.type("java.util.Map$Entry")
[JavaClass java.util.Map$Entry]
jjs> Java.type("java.util.Map.Entry")
[JavaClass java.util.Map$Entry]

要調用實例方法或訪問對象的實例字段,請使用點運算符,類似于在 Java 中完成的方式。下面的示例演示如何在對象上調用該方法:toUpperCase()String

jjs> var String = Java.type("java.lang.String")
jjs> var str = new String("Hello")
jjs> str
Hello
jjs> var upper = str.toUpperCase()
jjs> upper
HELLO

使用 JavaBeans

Nashorn 使您能夠將 JavaBeans 中的訪問器和突變器方法視為等效的 JavaScript 屬性。屬性的名稱是不帶 or 后綴的 JavaBean 方法的名稱,并以小寫字母開頭。getset

例如,您可以使用屬性調用對象中的 and 方法,如下所示:getYear()setYear()java.util.Dateyear

jjs> var Date = Java.type("java.util.Date")
jjs> var date = new Date()
jjs> date.year + 1900
2013
jjs> date.year = 2014 - 1900
114
jjs> date.year + 1900
2014

擴展 Java 類

您可以使用將 Java 類型作為第一個參數(shù)的函數(shù)和將方法實現(xiàn)(以 JavaScript 函數(shù)的形式)作為其他參數(shù)的函數(shù)來擴展類。Java.extend()

以下腳本擴展接口并使用它來構造新對象:java.lang.Runnablejava.lang.Thread

var Run = Java.type("java.lang.Runnable");
var MyRun = Java.extend(Run, {
    run: function() {
        print("Run in separate thread");
    }
});
var Thread = Java.type("java.lang.Thread");
var th = new Thread(new MyRun());

訪問 Java 類

使用 Nashorn 訪問包和類有兩種方法:傳統(tǒng)方法是使用全局對象,推薦的方法是使用全局對象。本節(jié)介紹這兩種方法。PackagesJava

預定義的頂級對象使您能夠使用完全限定的名稱訪問 Java 包和類,就好像它們是對象的屬性一樣。以下示例演示如何訪問包及其類(如果位于類路徑中):PackagesPackagesMyPackageMyClassMyPackage.jar

jjs> Packages.MyPackage
[JavaPackage MyPackage]
jjs> Packages.MyPackage.MyClass
[JavaClass MyPackage.MyClass]

訪問標準 Java 包和類比訪問定制包和類更簡單。為方便起見,為每個標準 Java 包定義了全局對象:、、、 和 。它們具有與對象的屬性相對應的別名。下面的示例演示如何訪問包和類:comedujavajavaxorgPackagesjava.langjava.lang.System

jjs> java.lang
[JavaPackage java.lang]
jjs> typeof java.lang
object
jjs> java.lang.System
[JavaClass java.lang.System]
jjs> typeof java.lang.System
function

報錯

java.lang.NullPointerException: Script for [js] not support !

Cannot invoke "javax.script.ScriptEngine.eval(String)" because "jsEngine" is

項目中使用了?com.github.whvcse包的easy-captcha?驗證碼依賴,升級至Jdk17后,驗證碼接口報錯:Cannot invoke "javax.script.ScriptEngine.eval(String)" because "engine" is null,錯誤原因很明顯腳本引擎執(zhí)行腳本語句報錯,因為執(zhí)行引擎為空。查詢相關資料Jdk8自帶的JavaScript引擎?nashorn?再升級到Jdk9后就被移除了,從而導致報錯

解決辦法:添加JavaScript引擎?nashorn依賴

<dependency>
    <groupId>org.openjdk.nashorn</groupId>
    <artifactId>nashorn-core</artifactId>
    <version>15.4</version>
</dependency>

動態(tài)代碼 預留js hook

通過js動態(tài)調整業(yè)務邏輯? 處理數(shù)據(jù)等? js代碼存到數(shù)據(jù)庫 或 緩存文章來源地址http://www.zghlxwxcb.cn/news/detail-788576.html

到了這里,關于【技巧】ScriptEngine--Java動態(tài)執(zhí)行JS Javascript腳本(可調用java的方法)的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!

本文來自互聯(lián)網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • c#動態(tài)執(zhí)行腳本的3種方式

    在C#中,可以使用一些第三方庫或內置類庫實現(xiàn)動態(tài)執(zhí)行腳本的功能。以下是幾個常用的方案: 使用Roslyn編譯器 Roslyn是微軟推出的一個開源的.NET編譯器平臺,它可以在運行時動態(tài)編譯C#代碼并執(zhí)行。通過Roslyn,可以實現(xiàn)對于代碼的熱更新。 示例代碼: 在上面的示例代碼中,

    2024年02月08日
    瀏覽(15)
  • 軟件測試|selenium執(zhí)行js腳本

    軟件測試|selenium執(zhí)行js腳本

    JavaScript是運行在客戶端(瀏覽器)和服務器端的腳本語言,允許將靜態(tài)網頁轉換為交互式網頁。可以通過 Python Selenium WebDriver 執(zhí)行 JavaScript 語句,在Web頁面中進行js交互。那么js能做的事,Selenium應該大部分也能做。WebDriver是模擬終端用戶的交互,所以就不能點擊不可見的元素

    2024年02月05日
    瀏覽(22)
  • 基于Selenium模塊實現(xiàn)無界面模式 & 執(zhí)行JS腳本

    基于Selenium模塊實現(xiàn)無界面模式 & 執(zhí)行JS腳本

    此篇文章主要介紹如何使用 Selenium 模塊實現(xiàn) 無界面模式 執(zhí)行JS腳本(把滾動條拉到底部),并以具體的示例進行展示。 創(chuàng)建瀏覽器對象之前,創(chuàng)建 options 功能對象 : options = webdriver.ChromeOptions() 添加無界面功能參數(shù): options.add_argument(\\\"--headless\\\") 構造瀏覽器對象,打開瀏覽器,并

    2024年02月13日
    瀏覽(24)
  • 【前端靈魂腳本語言JavaScript⑤】——JS中數(shù)組的使用

    【前端靈魂腳本語言JavaScript⑤】——JS中數(shù)組的使用

    ?? 作者: 阿偉 ?? 個人主頁: Flyme awei ?? 希望大家多多支持??一起進步呀! ?? 文章對你有幫助??關注?點贊??收藏?? 第一種: var 數(shù)組名 = new Array(); 創(chuàng)建一個空數(shù)組 第二種: var arr2 = new Array(10); 創(chuàng)建一個定長為10的數(shù)組 第三種 var arr3 = new Array(a,b,c); 創(chuàng)建時直接指定元素值

    2023年04月08日
    瀏覽(111)
  • 安卓手機怎么運行js腳本,手機的javascript怎么開

    安卓手機怎么運行js腳本,手機的javascript怎么開

    大家好,小編為大家解答手機怎么啟用javascript功能的問題。很多人還不知道安卓手機怎么運行js腳本,現(xiàn)在讓我們一起來看看吧! ? ? ? ? 最近在研究c++與JavaScript的交互,有朋友問我安卓怎樣與JavaScript交互,今天找到一個之前寫的小demo,實現(xiàn)的是安卓webview里面的JavaScript和

    2024年01月23日
    瀏覽(22)
  • 【轉】JavaScript 執(zhí)行上下文——JS 的幕后工作原理

    【轉】JavaScript 執(zhí)行上下文——JS 的幕后工作原理

    轉自譯文: JavaScript 執(zhí)行上下文——JS 的幕后工作原理 。 譯文中圖片不顯示,要結合原文看,看著不方便。整理了一份含圖片的。所以有了此篇的轉載,以方便閱讀。 以下是正文: 原文:JavaScript Execution Context – How JS Works Behind The Scenes,作者:Victor Ikechukwu 所有JavaScript代碼

    2024年01月20日
    瀏覽(26)
  • 如何動態(tài)執(zhí)行JS

    引言:隨著行業(yè)發(fā)展,技術更新,生產結構發(fā)生變化,低代碼技術又重新站上了舞臺,開發(fā)者們成為了舞臺幕后的操縱者。在web端的低代碼開發(fā)工具中,js占據(jù)了重要的位置,而【動態(tài)執(zhí)行】也成為了低代碼開發(fā)工具中不可或缺的一部分。本文記錄了js的動態(tài)執(zhí)行方法,以備不

    2024年02月06日
    瀏覽(17)
  • js實用方法記錄-js動態(tài)加載css、js腳本文件

    附送一個加載iframe,h5打開app代碼 方法調用: dynamicLoadJs(\\\'http://www.yimo.link/static/js/main.min.js\\\',function(){alert(\\\'加載成功\\\')}); 方法調用:? dynamicLoadCss(\\\'http://www.yimo.link/static/css/style.css\\\') 參考:動態(tài)加載js和css - 猿客 - 博客園 方法調用: dynamicLoadIframe(\\\'http://www.yimo.link\\\',function(){alert(\\\'加載

    2024年02月13日
    瀏覽(21)
  • javascript設置指定年月日,js動態(tài)顯示當前時間

    javascript設置指定年月日,js動態(tài)顯示當前時間

    大家好,本文將圍繞js中如何動態(tài)顯示日期時間展開說明,javascript設置指定年月日是一個很多人都想弄明白的事情,想搞清楚js動態(tài)顯示當前時間需要先了解以下幾個事情。 創(chuàng)建showTime()函數(shù),利用JavaScript中的Date對象的屬性及方法獲取時間,利用Window對象的 setInterval() 方法按

    2024年02月03日
    瀏覽(864)
  • 在java中使用javascript腳本

    在java中執(zhí)行js腳本,首先感覺這種操作有點無意義,但是存在即合理,作者要設計這個功能應該是有他的使用場景。java中支持使用jsp寫網頁,估計是這個原因才有了腳本引擎。 一、java支持的腳本語言查看 我們可以通過下面的代碼查看目前支持的腳本語言: 可以看到輸出內

    2024年02月04日
    瀏覽(15)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包