[英]Scripting java : import a class from an external file
我想将已经在外部文件夹中编写的类导入,例如:将位于c:\\class\\Example.java
类Example.java
导入到脚本中,例如使用
var importedClass = new JavaImporter("c:\\class\\Example.java");
要么
importClass("c:\\class\\Example.java");
这是在ScriptEngine rhino的脚本中
我怎样才能做到这一点 ???
我了解您要:
javax.tools包提供了一种用于编译代码的机制,尽管如果您不在JDK中运行,则ToolProvider.getSystemJavaCompiler()将返回null
并且您将不得不依靠其他一些编译机制(调用外部编译器;嵌入) Eclipse编译器;等等)。
Java字节码( .class
二进制文件)可以在运行时通过ClassLoader加载 。
为了使加载的类对脚本引擎可见,您需要通过ScriptEngineManager(ClassLoader)构造函数提供它们。
编辑:根据要求
public class HelloWorld {
public void say() {
System.out.println("Hello, World!");
}
}
该脚本仅调用Java反射API来从C:\\foo\\bin
目录加载和实例化类HelloWorld.class
:
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();
}
我敢肯定,还有更优雅的方法可以做到这一点。
我会问为什么这样做。
此处列出的解决方案将起作用。 问题将是:
如果我对您的理解正确,那么您实际上要尝试的是加载Java类,以便(大概)可以创建实例等。 术语是动态加载而不是导入。
Java允许您使用ClassLoader.loadClass(String)
方法动态加载字节码文件( *.class
)。 关于这个主题有很多资源。 例如,JNDI教程中的“ 类加载 ”页面。 准备花一些时间来解决这个问题。 特别是,由于您尝试加载不在应用程序常规类路径上的类,因此您需要创建一个新的类加载器来执行此操作。 java.lang.ClassLoader
类的Javadocs在这里 。
Java源代码无法直接加载,但必须首先使用Java编译器进行编译。 如果使用的是现代JDK安装,则可以在运行时调用Java编译器。 但是,JRE安装不包括Java编译器。 如果您的平台在运行时提供了Java编译器,则可以通过ToolProvider
类的getSystemJavaCompiler()
静态方法对其进行ToolProvider
。 再一次,从正在运行的Java应用程序中调用Java编译器很复杂。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.