簡體   English   中英

如何將 a.java 文件加載到變量中?

[英]How to load a .java file into a variable?

我對 java 還很陌生,目前正在開發基於文本的冒險游戲作為練習項目。

引擎加載場景來播放,這些場景都是“場景”超類中的所有子類,並顯示為例如。 “地牢.java”。 現在我希望游戲可以擴展。

想法是用戶可以將新場景 as.java-files 放入“Scenes”文件夾中,每次啟動游戲時,它都會讀取該文件夾中的所有文件並將它們安全地放入“Scene”類數組中。

我的問題是我不知道如何編碼。 我搜索了很多並嘗試了各種措辭,但我能找到的只是從 txt 文件或類似文件中讀取行的教程。 甚至可以在沒有序列化的情況下將完整的文件讀入變量嗎?

我已經嘗試了以下代碼,但還沒有開始測試它。

private static void buildScenePool() {

    File scenesFolder = new File("/scenes");

    \\ setup filter for .java files
    FilenameFilter javafilter = (dir, name) -> name.endsWith(".java");

    File[] sceneList = scenesFolder.listFiles(javafilter);

    \\ create new arry large enough for all scenes
    allScenes = new Scene[sceneList.length];

    try{
        FileInputStream fileIn = new FileInputStream(scenesFolder);
        ObjectInputStream objectIn = new ObjectInputStream(fileIn);

        \\ iterate trough the list array and safe files to array
        for (int x = 0; x < allScenes.length; x++) {
            allScenes[x] = objectIn.readObject( (Scene)sceneList[x] );
        }
        objectIn.close;
    } catch (IOException e) {
        System.err.println(e.toString());
    }   
}

這是相當復雜的。 java 代碼通常被編譯,因此,這意味着您必須掃描一個新的 java 文件,編譯它(這是它自己的復雜考驗,因為這也意味着正確設置類路徑等以便編譯器知道做什么),然后在 class 文件中加載編譯器生成的文件,然后在其中調用相應的方法。

可以這樣做。 只是,相當復雜。 您的標准 JVM 甚至不一定附帶編譯器; 這也是可以解決的(要么要求它只在一個可以運行的機器運行,而且 java 的現代部署規則涉及在用戶的機器上獲得 JVM,因此你因此選擇一個包含編譯器的機器 - 或者你可以只發布編譯器作為您的應用程序的依賴項, javac本身就是一個 java 應用程序並在任何 JVM 上運行)。

但是,更常用的方法是為此不實際使用 java。 相反,使用類似 java 的東西,但不要使用 java:腳本語言,如 groovy 或 javascript(好吧,這可能不是特別像 java)。

這就是它自身的復雜性。 沒有任何簡單的答案。

我認為現在是時候先考慮粗略的思路並確定您希望用戶(即想要添加場景的用戶)的體驗應該如何,然后針對您的具體選擇提出一個新的 SO 問題。

你寫 em,他們安裝 em

在這個 model 中,用戶只需下載或選擇其他人編寫的“場景”impl(一個“真正的”程序員,具有整個源代碼的完整分支,一個 IDE,一個構建工具,工作)。 不要敲它 - 編程很難,然后說:“哦,看,任何人都可以自定義場景,很簡單,只需打開notepad.exe ,編寫類似這樣的內容(示例 java 文件在這里),然后將其轉儲到Scene中文件夾和你 go”,但這一點都不容易 至少對於我們這些看起來很熟悉的程序員來說,但對於普通用戶來說,您只是在要求他們大聲說出一首古代蘇美爾語的詩——普通人不會編程。 如果他們會編程,他們就是程序員。 他們更願意獲得有關如何分叉項目並將其設置在 IDE 中的說明,而不是將原始 java 文件扔到某個地方的一些奇怪的事情。

腳本

這就是處理(用於編程 arduinos)所做的,或多或少是網絡瀏覽器所做的(這解釋了為什么 javascript 如此奇怪),以及大多數偽智能編輯器(如 TextMate 和 Emacs)的“插件系統”所做的:你編寫它們。 例如,您完全相信用戶編寫的自定義內容非常簡單且具有高度針對性(僅在您的應用程序范圍內運行才有意義,而不是作為獨立的東西 - 並且通常不會出現依賴關系),然后選擇適合 model 和 java 的語言當然不是那樣。

明顯的選項是 javascript 和 groovy。 這當然是可能的,但絕非易事。 Still, if you're interested, search the web for tutorials on how to run javascript or groovy inside a JVM, and you'll get plenty of hits.

Java代碼,你編譯

這就是您提出的唯一選擇。 我不推薦它,但如果你必須這樣做,你可以這樣做。 請注意,在我看來,根據您提出問題的方式和您的示例代碼,這些代碼會犯各種新手錯誤(例如打印並繼續異常處理,這總是錯誤的,使用過時的 API 以及弄亂內置的-在序列化中)這是超出您當前技能的一些球場。 挑戰總是很酷,所以,如果你想為它 go,你應該知道,這將是你寫過的最困難的事情,並且需要幾周的時間。 大量閱讀和實驗。

只是定義,真的

到目前為止,中心原則是您可以實際編程 使機器以某種方式運行的指令。 可能你不需要這些。 如果一個場景真的只是一個背景顏色和一些到處顯示的小部件,它甚至應該是代碼嗎? 也許您只想要一個聲明性設置:插件/場景編寫器只聲明某些屬性,這就是他們要做的一切,您只需“運行”這樣一個聲明性定義。 在這種情況下,聲明的“語言”可以是 JSON、XML、YAML、TOML 或為配置文件等設計的任何其他格式,並且您可以在嘗試使用用戶授權的代碼時編譯/編譯第一名。

為了將 Java 類加載到您的應用程序中,您需要編譯它們。 您可以通過調用javac可執行文件從 Java 執行此操作。 請參閱Java 中的啟動進程? 有關如何執行此操作的說明。 編譯后,您需要使用 class 加載器將類加載到 JVM 中,例如通過調用ClassLoader.defineClass 您可能還想配置一個保護域,以防止用戶提供的類行為不端。

但是,Java 可能不是擴展應用程序的最佳方法。 您可以考慮改用腳本語言,例如 JavaScript。 有關更多信息,請參閱Nashorn (包含在 Java 以前版本中的開源腳本引擎,現在可以單獨下載)和Java 腳本程序員指南

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM