Anonymous classes mess with field access from JS in unexpected ways

Marc Downie marc at openendedgroup.com
Fri Jul 25 22:48:05 UTC 2014


Accessing to fields (but not methods) of anonymous classes and their
superclasses seems broken, to me (1.9.0-ea-b23 & 1.8.0_20-ea-b23). Example:

package somepackage;

public class ScratchClass {

public class ClassOne {
public String peach = "pear";

public String banana() {
return "banana";
}
}

public ClassOne c2 = new ClassOne() {
public String yetMoreMember = "yet more";

public String banana() {
return "banana, overridden in c2";
}

public String pear() {
return "pear";
}
};

public ClassOne c1 = new ClassOne();
}

---

jjs> var sc = new (Java.type("somepackage.ScratchClass"))()
jjs> sc
somepackage.ScratchClass at 418e7838 *// expected*
jjs> sc.c1
somepackage.ScratchClass$ClassOne at 4f209819 *// expected*
jjs> sc.c2
somepackage.ScratchClass$1 at 7193666c *// expected*
jjs> sc.c1.peach
pear  *// expected*
jjs> sc.c1.banana()
banana  *// expected*
jjs> print(sc.c2.banana())
banana, overridden in c2  *// expected --- refers to overridden method*

So far so good. But:

jjs> print(sc.c2.peach)
undefined *// unexpected --- should refer to field in superclass ClassOne?*
jjs> print(sc.c2.yetMoreMember)
undefined *// unexpected --- should refer to field in anon class?*
jjs> print(sc.c2.pear())
<shell>:1 TypeError: somepackage.ScratchClass$1 at 7193666c has no such
function "pear"
*// unexpected --- should refer to method in anon class?*

If I give that anonymous subclass of ClassOne an actual name and
instantiate that instead all is well.

Bug or misunderstanding about the Java/JavaScript interface?

many thanks,

Marc.


More information about the nashorn-dev mailing list