簡體   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