mirror of
https://github.com/mozilla/gecko-dev.git
synced 2025-02-03 12:35:58 +00:00
6642d0e4f2
I'm having problems getting inner class objects with Rhino. I create a Hashmap, which is an implementation of Map. Map.Entry is an inner interface of Map with key-value pairs. If I have a Map object, "property", I should be able to get the key element with the expression "property.key". When I look at the "property" class name that Rhino returns I get: "java.util.HashMap$Entry". I don't believe Rhino has a notion of the inner Map.Entry object. The expression "property" succeeds. The expression "property.key", which should retrieve the Map.Entry keyValue(), fails with a "unexpected IllegalAccessException accessing Java field". I'm including a simple example that illustrates the problem. I hope you can shed some light on this. Thanks! Justyna < Justyna.Horwat@Sun.com > ---- import java.io.*; import java.util.*; import org.mozilla.javascript.*; public class MapTest { public static void main(String argv[]) { Test test = new Test(); test.testMap(); } } class Test { Map map; Set set; Iterator it; Map.Entry entry; public void testMap() { System.out.println("testMap"); map = new HashMap(); populate(); set = map.entrySet(); it = set.iterator(); // let's see if Map is populated correctly while (it.hasNext()) { entry = (Map.Entry) it.next(); System.out.println("entry: " + entry.getClass().getName()); System.out.println("key: " + entry.getKey()); System.out.println("value: " + entry.getValue()); } evaluate(); } void populate() { map.put("firstKey", "firstValue"); map.put("secondKey", "secondValue"); map.put("thirdKey", "thirdValue"); map.put("fourthKey", "fourthValue"); } public void evaluate() { Context cx = Context.enter(); Scriptable scope = cx.initStandardObjects(null); set = map.entrySet(); it = set.iterator(); while (it.hasNext()) { entry = (Map.Entry) it.next(); scope.put("property", scope, cx.toObject(entry,scope)); } Object eval = null; try { // attempt to get Map.Entry key value using Rhino eval = cx.evaluateString(scope, "property.key", "", 0, null); // Unwrap scoped object if (eval instanceof Wrapper) eval = ((Wrapper) eval).unwrap(); } catch (JavaScriptException jse) { System.out.println("EXCEPTION: " + jse.getMessage()); } // DELETE System.out.println("RHINO result: " + eval + ":"); System.out.println("RHINO class: " + eval.getClass().getName()); } }
<html> <!-- - The contents of this file are subject to the Netscape Public - License Version 1.1 (the "License"); you may not use this file - except in compliance with the License. You may obtain a copy of - the License at http://www.mozilla.org/NPL/ - - Software distributed under the License is distributed on an "AS - IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or - implied. See the License for the specific language governing - rights and limitations under the License. - - The Original Code is Rhino code, released - May 6, 1999. - - The Initial Developer of the Original Code is Netscape - Communications Corporation. Portions created by Netscape are - Copyright (C) 1998-1999 Netscape Communications Corporation. All - Rights Reserved. - - Contributor(s): - Norris Boyd - - Alternatively, the contents of this file may be used under the - terms of the GNU Public License (the "GPL"), in which case the - provisions of the GPL are applicable instead of those above. - If you wish to allow use of your version of this file only - under the terms of the GPL and not to allow others to use your - version of this file under the NPL, indicate your decision by - deleting the provisions above and replace them with the notice - and other provisions required by the GPL. If you do not delete - the provisions above, a recipient may use your version of this - file under either the NPL or the GPL. --> <body> <h1> <span CLASS=LXRSHORTDESC> Rhino: JavaScript in Java<p> </span> </h1> <span CLASS=LXRLONGDESC> Rhino is an implementation of JavaScript in Java. Documentation can be found <a href="http://www.mozilla.org/js/rhino/rhino.html">here</a>. </span> </body> </html>