【问题标题】:Pick .class file from a folder从文件夹中选择 .class 文件
【发布时间】:2015-08-26 17:21:17
【问题描述】:

我有一个接口 Operator,它有一种方法:

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 的一部分)

【问题讨论】:

标签: java


【解决方案1】:
  • 您需要将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();
    }
}

【讨论】:

  • 对不起,这部分代码是做什么的?类 cls = loader.loadClass(filename.substring(0, filename.length() - 6));
  • 它会删除文件的 .class 扩展名并加载实现 Operator 的类
  • @ Kael53 对不起,我是 java 新手,我无法理解您的应用程序例如 tis 部分:for (File classFile : f.listFiles(new FilenameFilter() { public boolean accept(File dir, String name) { return name.endsWith(".class"); } }))
  • 它按扩展名过滤文件,只获取带有 .class 的文件。没问题,兄弟,每个人都是新人一次?
  • 因为你的陈述是内在的,它对我来说变得如此复杂,我无法分离陈述
猜你喜欢
  • 2014-07-29
  • 1970-01-01
  • 1970-01-01
  • 2020-11-24
  • 2011-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-23
相关资源
最近更新 更多