Skip to content

Instantly share code, notes, and snippets.

@gwtnb
Last active August 29, 2015 14:14
Show Gist options
  • Save gwtnb/90f2d80a18177ab585bf to your computer and use it in GitHub Desktop.
Save gwtnb/90f2d80a18177ab585bf to your computer and use it in GitHub Desktop.
new Java objects in JavaScript
import javax.script._
class foo(s: String)
// call Class.forName not in JavaScript.
// calling Class.forName in JavaScript does not work.
object ClassForName {
def apply(className: String) = Class.forName(className)
}
object GetClass {
def apply(x: AnyRef) = x.getClass
}
object Rhino {
def main(args: Array[String]) {
val engine = new ScriptEngineManager(null).getEngineByName("JavaScript")
engine.put("class_for_name", ClassForName)
engine.put("get_class", GetClass)
try {
engine.eval("""
function construct(class_name) {
var class_obj = class_for_name.apply(class_name)
return function() {
// convert arguments object to array
var args = new Array(arguments.length)
for (var i = 0; i < args.length; ++i) {
args[i] = arguments[i]
}
var argumentClasses = new Array(args.length)
for (var i = 0; i < args.length; ++i) {
argumentClasses[i] = get_class.apply(args[i])
}
var constructor = class_obj.getConstructor(argumentClasses);
return constructor.newInstance(args)
}
}
var s = construct("foo")("abc");
print(s)
""")
} catch {
case e => println(e)
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment