我如何才能拥有一个类型为Java.util.Arraylist的javascript对象

How can I have a javascript object that has a type of Java.util.Arraylist?

本文关键字:util Java Arraylist 对象 javascript 类型 有一个 拥有      更新时间:2023-09-26

使用Solr ScriptUpdateProcessor进行修补,因此我有一个在没有浏览器的情况下执行的javascript文件。我对这方面还很陌生,不知道如何在调试器中运行它,并且仅限于系统日志记录。

在这个javascript文件中,我有一个对象,我认为它是一个数组,但奇怪的是,它缺少javascript数组的基本属性。

所以我用这个函数转储对象:

function log_object(object) {
  var output = '';
    for (var property in object) {
       output += property + ': ' + object[property]+'; 'n';
   }
   logger.info(output);
}

返回的结果看起来像"真正的"Java。最值得注意的是:

class: class java.util.ArrayList;

更多的是:

clone: function clone() {/*
java.lang.Object clone()
*/}
;
toArray: function toArray() {/*
java.lang.Object[] toArray()
java.lang.Object[] toArray(java.lang.Object[])
*/}
;
iterator: function iterator() {/*
java.util.Iterator iterator() 
*/}
;
addAll: function addAll() {/*
boolean addAll(int,java.util.Collection)
boolean addAll(java.util.Collection)
*/}
;
get: function get() {/*
java.lang.Object get(int) 
*/}
;
equals: function equals() {/*
boolean equals(java.lang.Object)
*/}

等等。令人震惊。

我是如何在javascript函数中得到一个基本的java对象的?这是怎么回事?

更新

java与javascript之间存在一些我以前不知道的灰色地带。test-update-script.js中的最后一个"工作代码"如下:

doc = cmd.solrDoc;  // org.apache.solr.common.SolrInputDocument <- note this is also java?
var contents = []; <-- 'normal' js Array.
vals = doc.getFieldValues(my_multivalued_field); // <--- vals is now java.util.arraylist
jsFriendlyAry = vals.toArray(); // <-- jsFriendlyAry is String[]
for (j = 0; j < jsFriendlyAry.length; j++) {
    contents.push(jsFriendlyAry[j]);
}

因此,可以将服务器端javascript和java混合使用。Oracle从脚本使用Java指南中的片段似乎需要一个我还没有弄清楚的include(特别是Java.to和Java.from),但要确认行为。

默认情况下,使用Java对脚本的支持来执行更新脚本(https://lucene.apache.org/solr/4_7_0/solr-core/org/apache/solr/update/processor/StatelessScriptUpdateProcessorFactory.html)

在Rhino Javascript引擎的最初实现中,JS被编译成Java类,并且这些脚本自1998年以来一直被解释。

因此,这些脚本似乎仍然是从Java作为Java运行的,而不是孤立运行的。这就解释了为什么转储的对象与POJO比"普通"JS对象有更多的共同点。