从文件夹中选择.class文件



我有一个接口操作符,它有一个方法,像这样:

public interface Operator
{
    double calculate(double firstNumber,double secondNumber);
}

然后我有四个类(加,减,除,乘)实现运算符如下:

public class Plus implements Operator
{   
    public double calculate(double firstNumber,double secondNumber)
    {
        return firstNumber + secondNumber;
    }
}
public class Minus implements Operator
{
    public double calculate(double firstNumber,double secondNumber)
    {
        return firstNumber - secondNumber;
    }
}

等等……对于处理操作符,我使用Map:

    private static Map<String,Operator> operatorMap = new HashMap<String,Operator>();
    static
    {
        operatorMap.put("+", new Plus());
        operatorMap.put("-", new Minus());
        operatorMap.put("*", new Multiply());
        operatorMap.put("/", new Divide());
    }
double output = 0;
output = operatorMap.get(elementInExpression[2]).calculate(firstNumber,secondNumber);

现在我想改变我的应用程序动态工作,如果我实现其他类,如%我的应用程序仍然工作。为此,我把。class文件放在一个文件夹中,我想从。class文件中自动选择。在我看来,我应该使用反射API。谁能帮我使用这个API?(不要使用反射,因为它不是java反射API的一部分)

  • 你需要在你的操作符类中添加public static String operator = "*";变量。

在一个特定的目录

File f = "\classesfolder\";
ClassLoader loader = new URLClassLoader(new URL[] { f.toURI().toURL() }, getClass().getClassLoader(););
FilenameFilter filter = new FilenameFilter() {
    public boolean accept(File dir, String name) {
        return name.endsWith(".class");
    }
  };
for (File classFile : f.listFiles(filter)) {
    try {
        // Remove the file extension
        String filename = classFile.getName().substring(0, filename.length() - 6);
        Class<? implements Operator> cls = loader.loadClass(filename);
        Operator operatorClass = (Operator) cls.newInstance();
        operatorMap.put(operatorClass.operator, operatorClass);
    } catch (Exception ex) {
        ex.printStackTrace();
    }
}

最新更新