Naturally, I wanted to see how easy it is to make Java scriptable. So I sat down and played with the Java scripting engine and my answer is this: very easy!
package rhinodemo;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
public class Factorial {
private final int n;
private int result = 1;
public Factorial(int n) {
this.n = n;
}
public int getResult() {
return result;
}
public Factorial compute() {
if(n >= 1) {
Factorial that = new Factorial(n-1);
that.compute();
result = n * that.getResult();
}
return this;
}
public static void main(String[] args)
throws Exception {
ScriptEngineManager mgr
= new ScriptEngineManager();
ScriptEngine engine
= mgr.getEngineByName("JavaScript");
engine.eval(
"importClass(Packages.rhinodemo.Factorial);" +
"importClass(Packages.junit.framework.Assert);" +
"" +
"Assert.assertEquals(24, " +
" new Factorial(4).compute().getResult());" +
"println('-ok-')");
}
}
What we have here is a Java class, Factorial, that computes n!. The protocol of this class is deliberately cumbersome: I wanted to have a real class with a real constructor and two meaningful methods, and not just one static method. The main() method executes Javascript code that tests the Factorial class using JUnit's Assert class (you need to have junit.jar on your classpath).
Even this short program demonstrates a few key points:
- Accessing Java libraries from Javascript
- Passing Javascript objects to Java code
- Creating instances of Java classes from within Javascript
язык красив
Anonymous
February 20, 2023 at 7:15 PM