2013-02-09 25 views
2

添加功能怎麼可能有類ABC,具有功能F,然後添加Dbin/和不修改A獲得除F不同的功能, BC以任何方式?爪哇 - 通過添加新的類,而無需修改奇招

我在Minecraft的ModLoader中看到了這一點。使用ModLoader,您可以將類從ModLoader複製到Minecraft。然後,您可以簡單地將一個以「mod_」開頭的新類放入Minecraft jar中,並將新東西添加到遊戲中。任何時候都沒有任何類直接引用你的「mod_Foobar」類。

一個小的工作示例,並鏈接到任何進一步的閱讀是可取的。

+0

我標記爲'反射',因爲我有一種感覺它涉及(雖然我真的不知道它的任何事情)。如果你知道它是無關的,請說出來,或刪除它。 – Nathan 2013-02-09 21:02:06

+0

我並不確切地知道如何,但我認爲你能夠以某種方式找到你的類路徑上的所有類,然後通過反射來加載它們。或者你可以找到.class文件,並通過一些機制加載它們(javassist應該可以工作,但可能還有其他的東西)。 Eclipse通過配置文件來做這些事情(就是加載它的插件)。等等......這一切都歸結爲尋找你可能想要在類路徑上使用的文件。 – kutschkem 2013-02-09 21:20:43

+0

難道這是戰略設計模式的行動嗎? :http://en.wikipedia.org/wiki/Strategy_design_pattern – 2013-02-09 21:34:22

回答

2
public class Reflection { 

    public void sayHello(String theClass){ 
     //Since Mod classes are in package 'mod', we precede their name accordingly. 
     Class aClass = Class.forName("mod." + theClass); 
     aClass.getMethod("sayHi").invoke(aClass.newInstance()); 
    } 

    public static void main(String[] args) { 
     //Get a list of the compiled classes in the 'mod' folder 
     String path = "./bin/mod"; 
     String fileName; 
     File folder = new File(path); 
     List<File> fileList = Arrays.asList(folder.listFiles()); 
     //Iterate through the list of classes to invoke their methods 
     Iterator<File> it = fileList.iterator();   
     while(it.hasNext()){ 
      fileName = it.next().getName();  
      //When invoking the sayHello method, we remove the file extension 
      new Reflection().sayHello(fileName.replace(".class", "")); 
     } 

    } 
} 

類MODA:

public class ModA { 
    public void sayHi(){ 
     System.out.println("Hi! I'm ModA.");   
    } 
} 

類商業方法:

public class ModB { 
    public void sayHi(){ 
     System.out.println("Hi! I'm ModB.");   
    } 
} 

請注意:

  • 我已經刪除了一些必要的異常,以澄清的例子處理。
  • Mod類位於名爲'mod'的包中。編譯後,它們出現在bin/mod中。可能有更清晰的掃描方式。
  • Mod類被編譯,打包成一個jar包含在構建路徑中。
0

類路徑用於加載類,它是有序的,所以如果你放置你的類之前的原始類,你的將被加載,而不是原來的。

0

我想這是關於應用基本的面向對象原則。

簡單的繼承可以讓你實現polymorphisme。在設計良好的系統中,這是將新行爲引入系統的一個很好的起點。

strategy pattern是工具箱中的另一種軟件設計模式,可以在運行時選擇算法的行爲。

factory pattern(結合上面提到的反射和模式)可以創建一個系統,您可以將類「拖放」到現有系統中,以便在不更改內核的情況下添加新功能。

您也可以通過classpath scanning在啓動時找到有趣的(帶註釋的)類來修改運行時行爲。

我確定MindCraft是一個設計良好的系統,它應用了比這裏描述的更多的模式。

最終,它歸結爲良好的設計和在正確的地方應用正確的模式。