繁体   English   中英

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

[英]Scripting java : import a class from an external file

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

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

要么

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

这是在ScriptEngine rhino的脚本中
我怎样才能做到这一点 ???

我了解您要:

  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!");
  }
}

该脚本仅调用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();
}

我敢肯定,还有更优雅的方法可以做到这一点。

我会问为什么这样做。

此处列出的解决方案将起作用。 问题将是:

  1. 您将获得一个经过拼凑的反射解决方案,这将很难解决。
  2. 您的客户可以在运行时加载补丁代码吗? 我工作过的每个地方都不是。

如果我对您的理解正确,那么您实际上要尝试的是加载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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM