簡體   English   中英

在Java中擴展主類

[英]Extending the main class in Java

我需要通過覆蓋它的一些方法來擴展我的主類的功能。 我期待擴展主類的類能夠運行。 但是,Eclipse不會將MyLauncher識別為可運行的類。 在下面的代碼中,我有一個由子類重寫的setup()方法。 我想要的是一種從超類運行main(..) ,還有從子類運行的設置。

// Launcher.java
public class Launcher {

    Launcher instance;

    public static void main (args[]) {
        instance = new Launcher(); // This is likely the problem
        instance.setup();
    }

    public void setup() {
        System.out.println("Default agent setup.");
    }
}

// MyLauncher.java
public class MyLauncher extends Launcher {

    public void setup() {
        System.out.println("New agent setup!");
    }
}

我接受這個的替代方案。 但是我無法在子類中添加main方法。 Launcher類在我正在制作的API中,因此它不能引用正在使用API​​的類MyLauncher。

編輯:我認為這是針對我的問題。 我決定尋找新的方法。 由於我正在使用JDT,我將解析Launcher並注入該類。

靜態方法不是繼承的,它們總是綁定到定義它們的類,並且需要明確地調用。

在你的情況下, MyLauncher需要一個main()方法,然后可以委托Launchermain()方法:

public class MyLauncher extends Launcher {

    public static void main (String[] args) {
        Launcher.main(args);
    }

    protected void setup() {
        System.out.println("New agent setup!");
    }
}

無法從外部調用受保護的方法。 所以MyLauncher.setup()不會覆蓋Launcher.setup()instance.setup(); 從Class Launcher調用public方法。

項目中只能有一個主要方法,即程序的一個入口點。 因此,我們假設您將在Launcher類中保留main方法。

您的主要方法簽名應該是:

public static void main (String args[])

除非你想要調用啟動器的setup()方法,否則你想做:

instance = new MyLauncher();

這將從MyLauncher調用setup()方法。

如果要從Launcher類調用setup(),則需要實例化啟動器類:

instance = new Launcher();

如果您希望能夠運行MyLauncher.setup() ,則該變量必須是MyLauncher 您正在main()函數中初始化並存儲Launcher

如果這兩個類在同一個包中,或者Launcher.java導入了MyLauncher類,那么Launchermain()函數應該是:

public class Launcher {
    Launcher instance;

    public static void main(String[] args) {
        instance = new MyLauncher();
        if(instance instanceof MyLauncher) {
            ((MyLauncher) instance).setup();
        } else
        {
            instance.setup();
        }
    }
}

正如您所說,直接在main創建Launcher實例的事實意味着沒有可用的繼承。 即使您可以輕松地從Eclipse啟動MyLauncher ,在main方法中您也不會知道實際使用了哪種類型來啟動它。 我看不到任何簡單的解決方案不涉及任一創建main中的每個類的方法提供類名作為一個命令行參數。 我可能會將“跑步”與其他任何東西分開:

public class Launcher {
    public static void launch(LaunchConfiguration configuration) {
        configuration.setup();
        ...
    }
}

public class LaunchConfiguration {
    public static void main(String[] args) {
        Launcher.launch(new LaunchConfiguration());
    }

    public void setup() {
    }
}

public class MyLaunchConfiguration {
    public static void main(String[] args) {
        Launcher.launch(new MyLaunchConfiguration());
    }

    @Override
    public void setup() {
    }
}

暫無
暫無

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

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