利用ScriptEngineManager实现字符串公式灵活计算

  • 时间:
  • 浏览:0
  • 来源:彩神大发APP_神彩大发APP官方

但是接触到ScriptEngine你这些东西的但是仅仅了解其eval()妙招 ,于是我利用了上述例子的思路去实现将字母替去掉 相应的数字去得到数字公式进而得到运算结果。

下面就简单的介绍有某种实现妙招的思路:

下面举个例子

那末替换的妙招当然是用正则去替换了,java中String对象有个replaceAll()妙招能不能 实现。



        Class claz=stu.getClass();

        String className= claz.getSimpleName();

        //String formula="Student.name+Student.age+10";  //1

        String formula="function test(){ if(Student.age==10){ return 12;} }"; //2

        System.out.println("the formula is:"+formula);

上述代码 还可注释2 打开注释1 试试 一样能不能 的 不过妙招不同而已 

.我歌词 都都.我歌词 都能不能 将公式的A B C替去掉 数字 转换为 1+2*3 最后就能不能 得到结果了

为了能不能 实现打印出里面参与计算的变量,我利用反射实现了获取值的妙招

具体怎么能会会实现.我歌词 都都.我歌词 都能不能 想就看,让他不具体介绍了,有了思路比那先 都重要。

            engine.eval(formula);            //2

            Invocable inv = (Invocable) engine; //2

            result=inv.invokeFunction("test");  //2   执行字符串 js test()

            System.out.println("the result is :"+result.toString());

        } catch (Exception e) {

            System.out.println("错误");

            e.printStackTrace();

        } 

    }

    

     // 把另另一个 字符串的第另另一个 字母大写 

     private static String getMethodName(String fildeName) throws Exception{  

             byte[] items = fildeName.getBytes();  

             items[0] = (byte) ((char) items[0] - 'a' + 'A');  

             return new String(items);  

     }

.我歌词 都都.我歌词 都知道js的eval()妙招能不能 执行字符串的代码 而恰好jdk6增加了对脚本语言的支持 .我歌词 都都.我歌词 都能不能 利用你这些特征对计算实现简单化的出理  

下面就是 代码的实现:

当时想你这些正则从前琢么了一会儿呢。然而我你这些实现却白忙活了,不可能 后期发现那末必要那末麻烦

在开发中.我歌词 都都.我歌词 都不可能 会出现一定量的公式计算,而那先 公式不可能 不会选者。

不可能 单纯的在代码中把那先 公式写死 实现,后期修改维护工作量显然会增加好多。

后期我也发现了好多表达式引擎如:Aviator、IKExpression等。

有了你这些思想 .我歌词 都都.我歌词 都就能不能 把公式维护到数据库或文件中 方便.我歌词 都都.我歌词 都后期对公式的维护修改 从前利用你这些工具应该能不能 减少计算代码编写的复杂性度 

然而过了一段时间,我在面试的但是和另另一个 前辈聊天时,前辈不知道不会被委托人写正则去替换,js中从前都在对象,也支持对象的运算,就是 直接往里放对象就能不能 。

累似 有个公式  A+B*C  其中A=1,B=2,C=3

就是 我被委托人查了查资料,发现甜得能不能 :

        //获取对象名称和值

        for(Field field: claz.getDeclaredFields()){

            try {

                //打开私有访问

                //field.setAccessible(true);

                String fieldName = field.getName();

                Method m = (Method) claz.getMethod("get" +getMethodName(fieldName));  

                System.out.println(getMethodName(fieldName));

                System.out.println(field.getGenericType()+"-"+"fieldName:"+fieldName+"="+m.invoke(stu));

            } catch (Exception e) {

                e.printStackTrace();

            } 

        }

        Object result=null;  //计算结果

        ScriptEngineManager manager = new ScriptEngineManager();   //创建另另一个 ScriptEngineManager对象

        ScriptEngine engine = manager.getEngineByName("js");  //通过ScriptEngineManager获得ScriptEngine对象

        engine.put(className, stu);  //将student对象贴到 ScriptEngine 中为计算变量提供值

        

        try {

            //result =engine.eval(formula);  //1 用ScriptEngine的eval妙招执行脚本  String formula="Student.name+Student.age+10";

            

        // 里面是student对象

    public static void Calculation(){

        Student stu=new Student();

        stu.setAge(10);

        stu.setName("zhangsan");

        stu.setSex(false);

比如用户今天说a=b+c 然而下次说公式不正确 应该是a=d+e

猜你喜欢

在.NetCore中使用Myrmec检测文件真实格式

github地址:https://github.com/rocketRobin/myrmecnuget地址:https://www.nuget.org/packages/Myr

2020-03-22

目前哪些手机可以无线充电怎么无线充电

三星S10Plus华为Mate20Pro无线充电,是近一两年来在旗舰手机上经常出显的俩个 多功能,当然,目前来看,搭载无线充电功能的手机还不过多,我来推荐几款。华为Mate2

2020-03-22

阿里云CDN直播架构与双11晚会直播实战

电商直播的最佳实践猫晚流量再创记录,阿里云直播方案护航优酷21150万用户体验【云栖精选11月刊】揭秘双11肩头的互联网技术超级工程阿里云跨界商务媒体合作芒果TV看明星也用云计

2020-03-21

国美 京东 天猫 苏宁在哪个买电器便宜靠谱?

下载百度知道APP,抢鲜体验至于价格展开完整性使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。不得劲推荐为你推荐:基本差太满换一换你对这种回答的评价是

2020-03-21

2019年即将进入尾声,你的2020年最想做什么事?

3、找到俩个 多多 可不还要长期发展的行业并现在结速投资。不怎么推荐展开全部8、希望我的第7条可不还要实现。5、希望我中间的1234条都能实现。使用百度知道APP,立即抢鲜

2020-03-21