Search code examples
javascriptingmozillarhinojava-6

Scripting java : import a class from an external file


I want to import a class that I already write in an external folder, for example : My class Example.java that is located in c:\class\Example.java to my script like using

var importedClass = new JavaImporter("c:\\class\\Example.java");

or

importClass("c:\\class\\Example.java");

this is in a script for ScriptEngine rhino
how can I do that ???


Solution

  • I understand that you want to:

    1. Compile a Java source file
    2. Load the compiled code
    3. Use the resultant class in some JavaScript

    The javax.tools package provides a mechanism for compiling code, though if you're not running in a JDK, ToolProvider.getSystemJavaCompiler() will return null and you'll have to rely on some other compilation mechanism (invoking an external compiler; embedding the Eclipse compiler; etc.).

    Java bytecode (.class binaries) can be loaded at runtime via ClassLoaders.

    In order for the loaded classes to be visible to your scripting engine, you'll need to provide them via the ScriptEngineManager(ClassLoader) constructor.


    EDIT: based on the requirements

    public class HelloWorld {
      public void say() {
        System.out.println("Hello, World!");
      }
    }
    

    This script just invokes the Java reflection API to load and instantiate a class HelloWorld.class from the C:\foo\bin directory:

    function classImport() {
      var location = new java.net.URL('file:/C:/foo/bin/');
      var urlArray = java.lang.reflect.Array.newInstance(java.net.URL, 1);
      urlArray[0] = location;
      var classLoader = new java.net.URLClassLoader(urlArray);
      return classLoader.loadClass("HelloWorld");
    }
    
    var myClass = classImport();
    
    for(var i=0; i<10; i++) {
      myClass.getConstructor(null).newInstance(null).say();
    }
    

    There are more elegant ways of doing this, I'm sure.