我有一个接口(interface) 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 文件中自动选择。我认为我应该使用 Reflection API。谁能帮我使用这个 API?(不要使用 Reflections,因为它不是 java Reflection 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();
}
}
关于java - 从文件夹中选择 .class 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32180000/