Rhino:Java数字不像Javascript数字

时间:2015-05-12 08:02:57

标签: java javascript rhino

我在Javascript程序中可以访问这个Java类的实例

public class ContentProvider {
  public Object c(int n) {
    switch (n) {
      case 1: return 1.1;
      case 2: return 2.2;
      case 3: return 3.3;
      case 4: return "4";
      case 5: return new java.util.Date();
    }
    return null;
  }
}

这是main()中的代码:

ScriptEngineManager mgr = new ScriptEngineManager();
ScriptEngine engine = mgr.getEngineByName("JavaScript");
engine.put("ctx", new ContentProvider());

res = engine.eval("ctx.c(1)");

System.out.printf("rhino:> %s (%s)%n"
        , res
        , res != null ? res.getClass().getName() : null
);

简单表达式ctx.c(1)打印:

rhino:> 1.1 (java.lang.Double)

现在,ctx.c(1) + ctx.c(2)

会发生什么
rhino:> 1.12.2 (java.lang.String)

最后(ctx.c(1) + ctx.c(2)) * ctx.c(3)

rhino:> nan (java.lang.Double)

Rhino正在执行字符串连接而不是数字算术!以下程序按预期工作:

engine.put("a", 1.1);
engine.put("b", 2.2);
engine.put("c", 3.3);
res = engine.eval("(a + b) * c");

输出:

rhino:> 10,89 (java.lang.Double)

2 个答案:

答案 0 :(得分:5)

这是Rhino的一个奇怪特性:使用Number设置的Java engine.put("one", new Double(1))按预期工作,而Java方法的结果取决于方法本身声明的返回类型,使用反射API:

  • 如果它是基元,如double,则转换为Javascript编号
  • 否则它会像其他主机对象一样处理,+表示连接,Object就像您的样本一样Double

您可以在当前wrapFactory.setJavaPrimitiveWrap(false)的{​​{1}}上使用WrapFactory配置此行为。这样,Rhino代码可以保存在程序的引导行中,并且不会混淆Context(我猜是某种配置代理)

来自live Javadoc of WrapFactory.isJavaPrimitiveWrap()

  

默认情况下,该方法返回true以指示实例   String,Number,Boolean和Character应该像其他任何一样包装   Java对象和脚本可以访问这些中可用的任何Java方法   对象

因此,您可以将此标志设置为ContentProvider,以指示应将Java false转换为Javascript编号。它只需要两行代码

Number

以下是the Gist,其中包含我用来测试的完整代码

答案 1 :(得分:1)

我创建了一个值包装器:

<ul class="nav nav-tabs">
    <li class="active"><a data-toggle="tab" href="#category_8">תתי קטגוריות</a></li>
    <li><a data-toggle="tab" href="#sub_cats_8">קטגוריה</a></li>
</ul>
<div class="tab-content">
    <div id="category_8" class="tab-pane fade in active category">
        <h1> קוסמטיקה </h1>
    </div>
    <div id="sub_cats_8" class="tab-pane fade">
        <ul class="sub_categories">
            <li><a href="products.php?act=scat&id=11">איפור</a></li>
        </ul>
    </div>
</div>

和编辑功能:

.tab-content {
    border: 1px solid #ddd;
    border-width: 0 1px 1px; /* Removes the top border */
    padding: 1px;
}
.nav-tabs > li {
    float: right;
}
.nav-tabs > li > a {
    margin-right: 0;
    margin-left: 2px;
}

现在表达式按预期工作。谢谢大家。