2

A機能 F を持つクラス、B、を持ち、クラスをC追加して、を変更せずに F とは異なる機能を取得するにはどうすればよいでしょうか。Dbin/ABC

これが MinecraftのModLoaderで行われるのを見たことがあります。ModLoader では、クラスを ModLoader から Minecraft にコピーします。次に、「mod_」で始まる新しいクラスを Minecraft jar にドロップするだけで、ゲームに新しいものが追加されます。「mod_Foobar」クラスを直接参照するクラスはありません。

小さな実用的な例と、それ以上の読み物へのリンクが望ましいです。

4

3 に答える 3

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.");        
    }   
}

クラス ModB:

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

ご注意ください:

  • 例を明確にするために、必要な例外処理をいくつか削除しました。
  • Mod クラスは、「mod」というパッケージに含まれています。コンパイル後、それらは bin/mod に存在します。それらをスキャンするよりクリーンな方法があるかもしれません。
  • Mod クラスはコンパイルされ、jar にパックされ、ビルド パスに含まれます。
于 2013-02-09T21:45:31.947 に答える
0

クラスパスはクラスをロードするために使用され、順序付けられているため、元のクラスの前にクラスを配置すると、元のクラスではなく自分のクラスがロードされます。

于 2013-02-09T21:22:11.453 に答える
0

基本的なオブジェクト指向の原則を適用することがすべてだと思います。

単純な継承により、ポリモーフィズムを実現できます。適切に設計されたシステムでは、これはシステムに新しい動作を導入するための良い出発点です。

戦略パターンは、ツールボックス内の別のソフトウェア設計パターンであり、実行時にアルゴリズムの動作を選択できます。

ファクトリ パターン(上記のリフレクションとパターンを組み合わせたもの) は、コアを変更せずに新しい機能を追加するために、クラスを既存のシステムに「ドロップ」できるシステムを作成できます。

クラスパス スキャンを実行して、起動時に興味深い (注釈付きの) クラスを見つけ、実行時の動作を変更することもできます。

MindCraft は、ここで説明したものよりも多くのパターンを適用する、適切に設計されたシステムであると確信しています。

最終的には、優れたデザインと適切なパターンを適切な場所に適用することになります。

于 2013-02-09T21:23:56.117 に答える