精华内容
下载资源
问答
  • 我正在尝试从MongoDBJava驱动程序调用存储的JavaScript函数.我一直在遵循本指南将该函数存储在DB服务器上,我可以从mongo shell调用该函数并返回结果.但是我无法弄清楚如何在Java调用相同的函数?我也试过用这种...

    我正在尝试从MongoDB

    Java驱动程序调用存储的

    JavaScript函数.

    我一直在遵循本指南将该函数存储在DB服务器上,我可以从mongo shell调用该函数并返回结果.

    但是我无法弄清楚如何在Java中调用相同的函数?

    我也试过用这种方法:

    public static String callFunction() {

    try (MongoClient client = new MongoClient("localhost")) {

    com.mongodb.DB db = client.getDB("TestDB");

    return db.doEval("echoFunction",3).toString();

    }

    }

    但是当我调用这个方法时,这就是我得到的:

    { "retval" : { "$code" : "function (x) {\n return x;\n}"},"ok" : 1.0}

    在这种情况下,我希望得到3号.

    上面代码的另一个问题是不推荐使用方法client.getDB().据我所知,调用的新方法是client.getDatabase(),它返回一个MongoDatabase对象,但根据API,没有执行函数的方法.

    所以我的问题是:是否可以从Java在数据库服务器上执行存储的JavaScript函数并获取该函数的结果?如果有可能的话,我会对如何做到这一点表示感谢?

    谢谢.

    编辑:

    “It seems like getNextSequence is a function written in the mongo

    javascript shell. Neither the database (mongod) nor the Java side

    knows this function exists and neither is able to interprete the

    Javascript code the function contains. You will have to reimplement it

    in Java. “

    我试图实现的函数比上面的例子复杂一点 – 它应该返回一个文档集合,并且似乎没有使用db.doEval方法.

    所以我认为评论是正确的?

    展开全文
  • <code>package d;... java.lang.NullPointerException: Cannot invoke "javax.script.ScriptEngine.eval(String)" because "jse" is null at d/d.s.main(s.java:13) 求解</code></pre>  </p>
  • eval函数eval函数接收一个由JavaScript语句组成的字符串,并且返回字符串中...调用eval函数的三种情况当调用eval函数时,JavaScript会创建新的执行环境,总共有三种情形:1 直接调用直接调用时,eval函数相关的执行环...

    eval函数

    eval函数接收一个由JavaScript语句组成的字符串,并且返回字符串中最后一条语句的返回值,如果最后一条语句没有返回值,那么eval函数返回undefined。如果传递给eval函数的不是字符串,那么传递什么,eval就返回什么。

    调用eval函数的三种情况

    当调用eval函数时,JavaScript会创建新的执行环境,总共有三种情形:

    1 直接调用

    直接调用时,eval函数相关的执行环境属性ThisBinding,LexicalEnvironment,VariableEnvironment的值如下:

    a) ThisBinding是调用eval函数时,调用方执行环境的ThisBinding

    b) LexicalEnvironment是调用eval函数时,调用方执行环境的LexicalEnvironment

    c) VariableEnvironemnt是调用eval函数时,调用方执行环境的VariableEnvironment

    假设有如下JavaScript代码(f在全局环境下被调用):

    functionf() {var i = 1;

    eval("var y = 2; i = 3");

    alert(y);

    }

    f();

    当eval函数被调用时,执行环境栈如下图所示:

    be5336cc6e4ec0c64e2642599cc41b55.png

    需要注意的是,当新建一个执行环境时要进行标识符绑定,绑定的标识符放到执行环境VariableEnvironment指向的Lexical Environment中。由于eval函数的VariableEnvironment与调用方(即调用eval的函数f)的VariableEnvironment指向同一个Lexical Environment,因此,在eval中声明的局部变量y被绑定到调用方的Lexical Environment中,这导致当eval函数调用结束,与eval相关的执行环境被弹出栈顶,而在eval中声明的局部变量y在函数f中仍然可以访问得到。因此,上面代码中alert会显示2,而不是报错。

    2 间接调用

    所谓间接调用,即将eval赋值给另一个变量后在调用,如下面代码所示:

    var g =eval;

    g("var y = 1;");

    间接调用也会创建新的执行环境,不同之处在于新执行环境的ThisBinding,LexicalEnvironment,VariableEnvironment的值不同:

    a) ThisBinding为全局对象

    b) LexicalEnvironment为全局执行环境的的LexicalEnvironment

    c) VariableEnvironment为全局执行环境的VariableEnvironment

    假如有下面的代码:

    functionf() {var i = 1;var gEval =eval;

    gEval("var y = 2; i = 3");

    alert(y);

    }

    f();

    当调用gEval时,执行环境栈如下图所示:

    ef808a9b4841b62e22e6dcb2ec6a1fa2.png

    可以看到,在gEval当中声明的变量都绑定到了全局执行环境当中,需要注意的是,gEval当中的变量i并不是引用的函数f的变量i,因为从gEval的作用域链访问不到函数f的局部变量i,此时gEval中的变量i就等价于没有使用关键字var声明了一个全局变量。函数f的alert语句仍然显示2,只是此时访问的y是全局环境中的变量y。

    3 严格模式下的eval

    在严格模式下,eval的LexicalEnvironment,VariableEnvironment指向属于eval自己的Lexcial Environment,而不是调用方的Lexical Environment,但是ThisBinding还是调用方的ThisBinding。同时,在严格模式下如果eval直接调用,那么eval的Lexical Environment的outer指针指向调用方的Lexical Environment,否则,如果是间接调用,那么eval的Lexical Environment的outer指针指向全局环境的Lexical Environment。

    假如有如下代码:

    "use strict"; //使用严格模式

    functionf() {var i = 1;

    eval("var y = 2; i = 3");

    alert(y);

    }

    f();

    当调用eval时,执行环境栈如下图所示:

    6461e10d7b52742c458fc5a4895641f9.png

    从图可以看到,eval中声明的局部变量y被绑定到自己的Lexical Environment中,eval中的i访问的是函数f声明的局部变量i。由于变量y被绑定在eval自己的Lexical Environment中,因此当eval运行结束,相关的执行环境被弹出栈顶之后,函数f是访问不到变量y的,因此alert要报错。

    IE中的eval

    IE9之前,无论eval是直接调用还是间接调用,eval都当成直接调用处理,如果需要有间接调用的效果,可以使用IE提供的execScript函数。

    参考资料:

    JavaScript权威指南

    ECMA-262

    展开全文
  • java script eval_eval()

    2021-02-28 08:25:02
    eval() 是一个危险的函数, 它使用与调用者相同的权限执行代码。如果你用 eval() 运行的字符串代码被恶意方(不怀好意的人)修改,您最终可能会在您的网页/扩展程序的权限下,在用户计算机上运行恶意代码。更重要的是...

    eval() 是一个危险的函数, 它使用与调用者相同的权限执行代码。如果你用 eval() 运行的字符串代码被恶意方(不怀好意的人)修改,您最终可能会在您的网页/扩展程序的权限下,在用户计算机上运行恶意代码。更重要的是,第三方代码可以看到某一个 eval() 被调用时的作用域,这也有可能导致一些不同方式的攻击。相似的 Function 就不容易被攻击。

    eval() 通常比其他替代方法更慢,因为它必须调用 JS 解释器,而许多其他结构则可被现代 JS 引擎进行优化。

    此外,现代JavaScript解释器将javascript转换为机器代码。 这意味着任何变量命名的概念都会被删除。 因此,任意一个eval的使用都会强制浏览器进行冗长的变量名称查找,以确定变量在机器代码中的位置并设置其值。 另外,新内容将会通过 eval() 引进给变量, 比如更改该变量的类型,因此会强制浏览器重新执行所有已经生成的机器代码以进行补偿。 但是,(谢天谢地)存在一个非常好的eval替代方法:只需使用 window.Function。 这有个例子方便你了解如何将eval()的使用转变为Function()。

    使用eval的糟糕代码:

    function looseJsonParse(obj){

    return eval("(" + obj + ")");

    }

    console.log(looseJsonParse(

    "{a:(4-1), b:function(){}, c:new Date()}"

    ))

    不用eval的更好的代码:

    function looseJsonParse(obj){

    return Function('"use strict";return (' + obj + ')')();

    }

    console.log(looseJsonParse(

    "{a:(4-1), b:function(){}, c:new Date()}"

    ))

    比较上面的两个代码片段,两个代码片段似乎是以相同的方式工作,但再想一想:eval的这个代码的速度要慢得多。 注意c: new Date()在执行体中。 在没有eval的函数中,对象在全局范围内被用来进行计算,因此浏览器可以放心的假设Date是来自window.Date的而不是一个名为Date的局部变量。 然而,在使用eval()的代码中,浏览器不能假设这一点,因为如果您的代码是下面这个:

    function Date(n){

    return ["Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"][n%7 || 0];

    }

    function looseJsonParse(obj){

    return eval("(" + obj + ")");

    }

    console.log(looseJsonParse(

    "{a:(4-1), b:function(){}, c:new Date()}"

    ))

    因此,在eval()版本的代码中,浏览器被迫进行高代价的查找调用以检查是否存在名为Date()的任何局部变量。 与Function()相比,这是非常低效的。

    在类似的情况下,如果您确实希望能够从Function()内部的代码调用Date函数,该怎么办? 你应该躲避并退回到eval()吗? 绝对不是,永远不要这么做。 而是尝试下面的方法。

    function Date(n){

    return ["Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"][n%7 || 0];

    }

    function runCodeWithDateFunction(obj){

    return Function('"use strict";return (' + obj + ')')()(

    Date

    );

    }

    console.log(runCodeWithDateFunction(

    "function(Date){ return Date(5) }"

    ))

    由于三重嵌套函数,上面的代码似乎效率低下,但让我们分析一下上述有效方法的好处:

    1.它使得传递给runCodeWithDateFunction的字符串中的代码更少。

    2.函数调用开销很小,使得代码尺寸小得多,值得获益

    3. Function()更容易让你的代码利用特性修饰"use strict";

    4.代码不使用eval(),使其比其他方式快几个数量级。

    最后,我们来看看简化版。 使用如上所示的Function(),您可以更有效地缩小传递给runCodeWithDateFunction的代码字符串,因为函数参数名称也可以缩小,如下面的缩小代码所示。

    console.log(Function('"use strict";return(function(a){return a(5)})')()(function(a){

    return"Monday Tuesday Wednesday Thursday Friday Saturday Sunday".split(" ")[a%7||0]}));

    对于常见用例,eval()或Function()还有更安全(而且更快!)的替代方案。

    展开全文
  • 今天群里聊天,有人提出了一个很有意思的问题:我想的是,我传入一个字符串,这个字符串就是if的逻辑条件...那么Java有没有这样的Eval()函数呢?Java作为强类型的静态语言,应该是没有这玩意的。但是Java6开始,Java...

    今天群里聊天,有人提出了一个很有意思的问题:

    我想的是,我传入一个字符串,这个字符串就是if的逻辑条件,怎么把这个字符串转为一个if的逻辑条件

    这个让人第一个想到的就是JS里面的Eval了,作为动态语言JS的eval()函数会将传入的字符串当做 JavaScript 代码进行执行。

    那么Java有没有这样的Eval()函数呢?

    Java作为强类型的静态语言,应该是没有这玩意的。但是Java6开始,Java有了个Mustang 的脚本引擎,这一套 API 提供了在 Java 程序中调用各种脚本语言引擎的接口。

    关于Mustang 的脚本引擎,详细文档看这里:

    Mustang 的脚本引擎

    因此,我们只要调用JavaScript的Eval()即可。

    代码如下:

    import javax.script.ScriptEngine;

    import javax.script.ScriptEngineManager;

    import javax.script.ScriptException;

    /**

    * @author DXG

    * @Date: 2019/10/31 15:11:05

    */

    public class test {

    public static void main(String[] args) {

    test("1>2");

    test("1==2");

    test("1<2");

    test("(1+1+1)>2");

    }

    private static void test(String pm1) {

    // 实例化一个工厂

    ScriptEngineManager manager = new ScriptEngineManager();

    // 查找可用的脚本引擎

    ScriptEngine engine = manager.getEngineByName("js");

    try {

    System.out.println(engine.eval(pm1));

    } catch (ScriptException e) {

    e.printStackTrace();

    }

    }

    }

    展开全文
  • 在服务器端可以通过db.eval函数来执行javascript脚本,也可以把javascript脚本保存在数据库中,然后在别的数据库命令中调用.一、db.eval 执行服务器端脚本利用db.eval函数可以在MongoDB服务器端执行javascript脚本.这...
  • 首先将执行的source语句如下 source(‘D:/xxx/xxx/xxx/py/test.R’) ,如果有函数...在Rstdio中的console中执行一遍,看看是否报错,不报错了以后,在Java中执行 RConnection connection = Rservel.getRConnectio...
  • RConnection c = new RConnection();// REXP x = c.eval("source('D:\\\\jiaoben\\\\RJava_test.R',encoding = \"UTF-8\")");REXP x = c.eval("source('D:\\\\jiaoben\\\\Rjava_testx6.R',encoding = \"UTF-8...
  • pytho的使用和分发完全是免费的,它是一种面向对象的语言,它的。它的类模块支持多态,操作符重载和多重继承等高级...python可以调用C和C++的库,可以被C和C++的程序调用,可以与java组件集成,可以和COM和.Net等...
  • 我正在使用Spring Boot实现一个REST服务,它使用Clojure通过多次调用Compiler.eval()来计算结果 . 我有一些Clojure的东西应该在所有请求(常量,函数,全局变量等)之间共享,以及一些每个请求应该被隔离并且对每个...
  • java 调用js

    2013-03-14 17:17:00
    利用js的库实现个计算器可以这么简单呀。。 ScriptEngineManager scriptManager = new ScriptEngineManager(); ScriptEngine js = scriptManager.... try { System.out.println(js.eval("5+6*9")); } cat...
  • 由于任务的需要,最近一直在使用Rserve包将java与R这两大利器结合起来使用。 在利用R文件进行项目开发时,往往要设计自己的函数库。 本人设计的其中一个R函数如下: #方法6:主题数的计算 ## 由于...
  • 今天群里聊天,有人提出了一个很有意思的问题: 我想的是,我传入一个字符串,这个字符串就是if的逻辑条件,怎么把...那么Java有没有这样的Eval()函数呢? Java作为强类型的静态语言,应该是没有这玩意的。但是J...
  • 同时mongodb -java-driver3.0中DB类也已经置为Deprecated,其方法eval(),doEval()也一样,而MongoDataBase类中我没有找到执行脚本的方法,请问各位大神是不是有什么替代的方法,还是Mongodb不再建议执行js脚本,但我...
  • java 调用存储过程

    2012-11-22 15:30:00
    create or replace procedure test_0 (fid in integer,reval out integer,reval1 out integer) as begin insert into test_1 values(fid); commit; reval := 10*fid; reval1 := 20*fid;end te...
  • pytho的使用和分发完全是免费的,它是一种面向对象的语言,它的。它的类模块支持多态,操作符重载和多重继承等高级...python可以调用C和C++的库,可以被C和C++的程序调用,可以与java组件集成,可以和COM和.Net等...
  • java调用自带的计算器

    2019-09-12 12:04:26
    ScriptEngineManager manager = new ScriptEngineManager(); ScriptEngine SE = manager.getEngineByName("js"); String number="((15+5)*(12/3))*5+1+1.1*0.1";... String ans = SE.eval(number).toString(...
  • java版本和rJava版本一定要对应。 2、使用source时尽量避免R语言脚本路径里不要有中文,如果文件中有设定路径的地方,一定记得使用/,而不\,否则,Rserve直接异常退出。 RConnection connection = null; try ...
  • 场景: 类C中存有方法A()和B(),String str...主要用到java反射机制,动态调用的方法: a.getClass().getMethod(str, new Class[]{}).invoke(a, new Object[]{}) 其中,a为类的对象,str为要被调用的方法名 1、a...
  • java代码:PythonInterpreter interpreter = new PythonInterpreter();PySystemState sys = Py.getSystemState();sys.path.add("C:\\Python27\\jython2.5.2\\Lib");interpreter.execfile("F:\\Eclipse_WorkSpace\\...
  • JAVA调用R语言 (未完)

    千次阅读 2019-03-19 17:52:46
    R语言中起服务 > library(Rserve) > Rserve() 在java中调用 public static void main(String[] args) { try { System.out.println("ok");... RConnection c = new RConnection(... REXP x = c.eval(...
  • java"]ScriptEngineManager manager = new ScriptEngineManager(); ScriptEngine engine = manager.getEngineByName("javascript"); engine.put("ps", this); engine.eval(script...
  • RConnection c = new RConnection();// REXP x = c.eval("source('D:\\\\jiaoben\\\\RJava_test.R',encoding = \"UTF-8\")"); REXP x = c.eval("source('D:\\\\jiaoben\\\\Rjava_testx6.R',enc...
  • java代码: PythonInterpreter interpreter = new PythonInterpreter(); PySystemState sys = Py.getSystemState(); sys.path.add("C:\\Python27\\jython2.5.2\\Lib"); interpreter.execfile("F:\\Eclipse_...
  • String window = ""; ScriptEngineManager sem = new ScriptEngineManager(); ScriptEngine se = sem.getEngineByName("js");...其实我只是想通过JS取屏幕宽window.innerWidth再赋值给个java变量 请各位不吝赐教
  • 工具和资料正文一些小的javascript片段可以很方便的直接使用ScriptEngine.eval()直接导入,但是如何使用require方法导入使用npm下载的javascript模块呢?答案是使用jvm-npm这个项目。首先,创建一个目录放置所有...
  • FileReader fileReader = new FileReader(request.getSession().getServletContext().getRealPath("/WEB-INF") + "/res/js/devpaperless.v26.js");...js.eval(fileReader); if (js instanceof Invo
  • java 操作调用js

    2017-05-01 23:51:18
    1/直接调用: ScriptEngineManager manager=new ScriptEngineManager(); ScriptEngine engine=manager.getEngineByName("javascript"); try { engine.eval("var a=3; var b=4;print (a+b)"); } catch ...
  • Java通过JRI调用R

    2015-12-28 17:59:08
    该资源是用Eclipse4.4 + jdk1.6(32位) + R3.2.3(32位)开发的,用Java通过JRI调用R的案例, 先启动R的计算引擎:Rengine Rengine re = new Rengine(new String[]{"--vanilla"},false,null); 然后,调用R里的rnorm()...

空空如也

空空如也

1 2 3 4 5 ... 9
收藏数 174
精华内容 69
关键字:

java调用eval

java 订阅