我有一个接口操作符,它有一个方法,像这样:
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();
}
}