簡體   English   中英

java:在運行時編譯繼承類

[英]java: compile inheriting class at runtime

我目前正在為我的大學做一個項目。 我正在開發一個允許用戶在文本區域中鍵入java方法的應用程序。 然后,應用程序將這些方法放入一個類中,並在用戶點擊編譯按鈕時編譯它。

到目前為止,我使用了這種方法: https//stackoverflow.com/a/2946402

它起初對我有用,但它只編譯一個簡單的(獨立)類。 我必須在運行時編譯的類擴展了應用程序中的另一個類。 通過這種方式,用戶應該可以訪問我實現的超類中的一些方法。 這是我用來編譯類的方法:

    public Class<?> loadClass(String filename) {
        WorkingDirectory workingDirectory = WorkingDirectory.getInstance();
        File directory = workingDirectory.getCompileDirectory();
        File javaFile = workingDirectory.createJavaFileFromUserProgram(filename);
        Class<?> cls = null;
        try {

            // Compile source file.
            JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();

            compiler.run(null, null, null, javaFile.getPath());

            URLClassLoader classLoader = URLClassLoader.newInstance(new URL[] { directory.toURI().toURL() });
            cls = Class.forName(filename, true, classLoader);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return cls;
    }

這適用於沒有擴展任何東西的類。 當我添加擴展時,我最終收到此錯誤消息:

    error: cannot find symbol
    public class UsersClass extends ExistingClass { public void main() {
                                    ^
      symbol: class ExistingClass
    1 error
    java.lang.ClassNotFoundException: UsersClass
        at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
        at java.net.FactoryURLClassLoader.loadClass(URLClassLoader.java:814)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Class.java:348)
        at utils.SimulatorClassloader.loadClass(SimulatorClassloader.java:51)
        at simulator.Simulator.lambda$4(Simulator.java:171)....

有人知道我需要在我的方法中添加/更改什么嗎? 我做了幾個小時的研究,但從那以后我沒有取得進展。

我沒有認識到一些錯誤,但是用LKTN.25暗示我發現了它們。

首先:UsersClass在導入部分有一個拼寫錯誤。 在這個錯誤消失后,出現了另一個錯誤。

第二:我的基類沒有默認構造函數和子類。 並且子類沒有覆蓋其他構造函數。 因此,不能創建子類的實例。

顯然“有人知道我需要添加/改變我的方法嗎?” 這不是正確的問題。 錯誤在別的地方。

更新:我認為我必須在users類中插入構造函數,因為我無法在運行時創建實例。 users類根本不需要構造函數(就像在java中一樣)。 它從超級課程中獲得。

顯然,以下代碼段不起作用。

    Class<?> cls = new SimulatorClassloader().loadClass(this.simulatorGUI.getStageTitle());
                try {
                    Method method = cls.getMethod("main");
                    try {
                        method.invoke(cls.newInstance());
                    } catch (Exception e1) {
                        // TODO Auto-generated catch block
                        e1.printStackTrace();
                    }

但是這個(略微修改過的代碼)確實有效:

    Class<?> cls = new SimulatorClassloader().loadClass(this.simulatorGUI.getStageTitle());
                try {
                    Method method = cls.getMethod("main");
                    try {
                        Object obj = cls.newInstance();
                        method.invoke(obj);
                    } catch (Exception e1) {
                        // TODO Auto-generated catch block
                        e1.printStackTrace();
                    }

暫無
暫無

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

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