[英]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.