2

怎么可能拥有具有功能 F 的类A, B, ,C然后在不修改或以任何方式将类添加Dbin/F 并获得与 F 不同的功能?ABC

我已经在ModLoader for Minecraft 中看到了这一点。使用 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

我想这都是关于应用基本的 OO 原则。

简单的继承允许您实现多态性。在设计良好的系统中,这是将新行为引入系统的良好起点。

策略模式是工具箱中的另一种软件设计模式,可以在运行时选择算法的行为。

工厂模式(结合反射和上面提到的模式)可以创建一个系统,您可以在其中将类“拖放”到现有系统中,以便在不改变其核心的情况下添加新功能。

您还可以在启动时进行类路径扫描以查找有趣的(带注释的)类以修改运行时行为。

我确信 MindCraft 是一个设计良好的系统,它应用了比这里描述的更多的模式。

最终,这一切都归结为良好的设计并在正确的位置应用正确的模式。

于 2013-02-09T21:23:56.117 回答