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