脚本java:从外部文件导入类

Mar*_*ayi 5 java scripting mozilla rhino jdk1.6

我想导入一个我已经在外部文件夹中编写的类,例如:我的类Example.java位于c:\class\Example.java我的脚本中,就像使用一样

var importedClass = new JavaImporter("c:\\class\\Example.java");
Run Code Online (Sandbox Code Playgroud)

要么

importClass("c:\\class\\Example.java");
Run Code Online (Sandbox Code Playgroud)

这是在ScriptEngine rhino的脚本
中我该怎么做?

McD*_*ell 5

我明白你想:

  1. 编译Java源文件
  2. 加载编译的代码
  3. 在某些JavaScript中使用结果类

javax.tools包提供了编译代码的机制,但如果你不是在JDK中运行,ToolProvider.getSystemJavaCompiler()将返回null,你就必须依靠其他一些编译机制(调用外部编译器;嵌入Eclipse编译器;等等).

Java字节码(.class二进制文件)可以在运行时通过ClassLoader加载.

为了使加载的类对脚本引擎可见,您需要通过ScriptEngineManager(ClassLoader)构造函数提供它们.


编辑:根据要求

public class HelloWorld {
  public void say() {
    System.out.println("Hello, World!");
  }
}
Run Code Online (Sandbox Code Playgroud)

该脚本只调用Java反射API HelloWorld.classC:\foo\bin目录中加载和实例化一个类:

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();
}
Run Code Online (Sandbox Code Playgroud)

我敢肯定,还有更优雅的方式.