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