Nashorn Roadmap & Rhino migration question

Paul Bakker pgbakker at gmail.com
Wed Aug 6 19:06:36 UTC 2014


Hi Sundar,

Does the approach you suggested also work for implementing 
interfaces/abstract classes, like I did in my example?

When we built this in Rhino, we had a hard time figuring out how to 
extend (Abstract) Java classes/implement Java interfaces through 
JavaScript that were loaded dynamically using a custom classloader at 
runtime in scripting.

The only way that worked in Rhino was using a custom Packages instance 
created with new Packages(ClassLoader). Loading a class through 
reflection and then trying to provide an implementation through 
JavaScript didn't work.

So, this is what we're doing in Rhino:

      try {
	 //Create custom classloader that extends applicationclassloader and set it temporarily as applicationclassloader
	 var cx = Packages.org.mozilla.javascript.Context.getCurrentContext()
          var savedCL = cx.getApplicationClassLoader()
          var mediaCL = java.net.URLClassLoader([new java.net.URL("mycustomprotocol:///bin/")], savedCL)
          cx.setApplicationClassLoader(mediaCL)

	 //Create custom Packages, using a custom classloader that extends the applicationclassloader
	 var customPackages = new Packages(mediaCL); //Seehttp://osdir.com/ml/mozilla.devel.jseng/2002-06/msg00037.html

	 //Extend abstract class 'MyClass', providing the implementation through JavaScript
          var callBackClass = new customPackages.com.mycompany.MyClass({
                 name: function(arg1, arg2) {
                      //Some code here
                  }
              })
      } catch (e) {
          log.error(e)
      } finally {
          cx.setApplicationClassLoader(savedCL);
      }

Paul

On 8/1/2014 8:49 PM, Jim Laskey (Oracle) wrote:
> Hi,
>
> Nashorn engine picks up thread-context loader at the time of engine
> creation or user supplied loader (with nashorn specific extension API).
>
> For the cases like you specify, you've to use reflection - but only to
> get to the class. Something like
>
> // get java.lang.Class object of the desired class using the class
> loader "mediaCL"
> var myClass =
> java.lang.Class.forName("customPackages.com.mycompany.MyClass", true,
> mediaCL);
> // make "static" reference to that class.
> // MyClass is an instance of StaticClass in nashorn
> var MyClass = myClass.static;
>
> // MyClass can be used just like you'd use other java classes from script
>
> // new object
> var obj = new MyClass();
> // instance method
> obj.mymethod("bar");
> // static method
> print(MyClass.myStaticBar());
>
> Hope this helps,
> -Sundarl,


More information about the nashorn-dev mailing list