Java - 通过添加新类来添加功能而不修改任何其他内容

时间:2013-02-09 21:01:11

标签: java reflection

如何使用功能F创建课程ABC,然后将课程D添加到bin/并获得不同功能比F而不以任何方式修改ABC

我已经在ModLoader为Minecraft看到了这一点。使用ModLoader,您可以将类从ModLoader复制到Minecraft。然后,您可以简单地将以“mod_”开头的新类放入Minecraft jar中,并为游戏添加新内容。在任何时候都没有任何类直接引用你的“mod_Foobar”类。

一个小的工作示例,以及任何进一步阅读的链接都是可取的。

3 个答案:

答案 0 :(得分: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", ""));
        }

    }
}

Class ModA:

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

Class ModB:

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

请注意:

  • 为了澄清这个例子,我删除了一些必要的异常处理。
  • Mod类位于名为“mod”的包中。编译后,它们出现在bin / mod中。可能有一种更清晰的扫描方式。
  • 编译Mod类,将其打包到jar中并包含在构建路径中。

答案 1 :(得分:0)

类路径用于加载类并且它是有序的,因此如果您将类放在原始类之前,那么将加载您的类而不是原始类。

答案 2 :(得分:0)

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

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

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

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

您还可以classpath scanning在启动时查找有趣的(带注释的)类来修改运行时行为。

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

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