java 计算数学表达式及执行脚本语言

本文介绍 Java SE 6 中对脚本语言的支持,包括如何在 Java 代码中执行脚本语言,与脚本进行交互及动态调用脚本的方法。演示了使用 ScriptEngine 进行 JavaScript 的执行和 Invocable 接口的调用。

  java SE6中对常用的脚本语言做了支持。

  可供使用者在java代码中执行脚本语言,还可以利用get("key"),put("key","value")与其交互,并可以动态调用脚本。

package com.test;

import java.util.List;
import javax.script.Invocable;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineFactory;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;

public class Demo {

    public static void main(String[] args) {
        ScriptEngineManager manager = new ScriptEngineManager();
        // 得到所有的引擎工厂
        List<ScriptEngineFactory> list = manager.getEngineFactories();
        for (ScriptEngineFactory factory : list) {
            System.out.println("支持的脚本语言"+factory.getNames());
            // 支持的脚本语言[js, rhino, JavaScript, javascript, ECMAScript, ecmascript]
        }
        
        // 得到常用的javascript脚本
        ScriptEngine engine = manager.getEngineByName("javascript");

        try {
            // 执行脚本
            System.out.println(engine.eval("2+3*2"));  // 8
            System.out.println(engine.eval("(true||false)&&true"));  //true
            
            // 和脚本交互
            engine.put("name", "123456");
            engine.eval("var out = '';" +
                        "for(i=0;i<name.length;i++){" +
                        "    out = name.charAt(i)+ out}");
            String name = (String)engine.get("out");
            System.out.println("name:"+name);
            
            // 动态调用脚本语言(脚本引擎得实现Invocable接口)
            String str = "abcdef";
            if(engine instanceof Invocable){
                engine.eval("function str1(name){" +
                        "var out = '';" +
                        "for(i=0;i<name.length;i++){" +
                        "    out = name.charAt(i)+ out}" +
                        "   return out;}" +
                        "function str2(name){" +
                        "    return 123}");
                
                Invocable invocable = (Invocable) engine;
                try {
                    Object obj = invocable.invokeFunction("str1", "123456");
                    System.out.println("obj:"+obj);
                } catch (NoSuchMethodException e) {
                    e.printStackTrace();
                }
            }
            
            // 动态实现接口
            engine.eval("function run(){" +
                    "print('异步调用')}");
            Invocable invocable = (Invocable) engine;
            // 让其实现Runnable接口
            Runnable runnable = invocable.getInterface(Runnable.class);
            // 启动线程
            Thread t = new Thread(runnable);
            t.start();
        
        } catch (ScriptException e) {
            e.printStackTrace();
        }
        
        
    }
}

 

转载于:https://www.cnblogs.com/x-jingxin/p/6841585.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值