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)