Bug report: can't call static methods on a Java class instance
Attila Szegedi
attila.szegedi at oracle.com
Wed Oct 9 07:55:10 PDT 2013
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.liron at 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 at ... 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)
>
More information about the nashorn-dev
mailing list