I understand the workaround, but again I fail to see the rationale behind Nashorn's overly-strict interface to Java. What's wrong with supporting the shorthand in Nashorn, especially when Rhino behaves as JavaScript programmers would expect?

On 10/09/2013 10:55 PM, Attila Szegedi wrote:
Yup. Static methods can't be invoked on instances. This is by design. The 
following will work:

        Java.type("MyClass").myMethod()

of course, you can reuse it as:

        var MyClass = Java.type("MyClass")
        ...
        MyClass.myMethod()

As a matter of fact, you can even get the method and invoke it later:

        var myMethod = Java.type("MyClass").myMethod
        ...
        myMethod()

This will also work:

        myInstance.class.static.myMethod()

as "static" is a synthetic property on java.lang.Class objects that returns the 
object representing their static facet (basically, containing static members and acting 
as a constructor - the same object Java.type() returns).

Attila.

On Oct 9, 2013, at 4:13 PM, Tal Liron <tal.li...@threecrickets.com> wrote:

If we have a Java class:

class MyClass {
  public static void myMethod();
}

And in JavaScript try:

myInstance.myMethod()

Then we would get an exception that looks something like this:

myscript.js:... TypeError: MyClass@... has no such function "myMethod"
    at jdk.nashorn.internal.runtime.ECMAErrors.error(ECMAErrors.java:56)
    at jdk.nashorn.internal.runtime.ECMAErrors.typeError(ECMAErrors.java:212)
    at jdk.nashorn.internal.runtime.ECMAErrors.typeError(ECMAErrors.java:184)
    at jdk.nashorn.internal.runtime.ECMAErrors.typeError(ECMAErrors.java:171)
    at 
jdk.nashorn.internal.runtime.linker.NashornBottomLinker.linkBean(NashornBottomLinker.java:113)
    at 
jdk.nashorn.internal.runtime.linker.NashornBottomLinker.getGuardedInvocation(NashornBottomLinker.java:68)
    at 
jdk.internal.dynalink.support.CompositeGuardingDynamicLinker.getGuardedInvocation(CompositeGuardingDynamicLinker.java:124)
    at 
jdk.internal.dynalink.support.LinkerServicesImpl.getGuardedInvocation(LinkerServicesImpl.java:138)
    at jdk.internal.dynalink.DynamicLinker.relink(DynamicLinker.java:232)
    at 
jdk.nashorn.internal.scripts.Script$default.runScript(component/services/sincerity/version/default.js:6)
    at 
jdk.nashorn.internal.runtime.ScriptFunctionData.invoke(ScriptFunctionData.java:527)
    at 
jdk.nashorn.internal.runtime.ScriptFunction.invoke(ScriptFunction.java:204)
    at jdk.nashorn.internal.runtime.ScriptRuntime.apply(ScriptRuntime.java:367)


Reply via email to