是否可以通过反射创建动态 IF 语句?
我看过 BeanShell 的示例(例如:Dynamic if statement evaluation problem with string comparison),但我想知道如果没有 BeanShell 是否可以做到这一点,并指出一些示例以适应我的需要。
基本上我有一个形式的声明:A 运算符 B。
A 和 B 可以是数字( double 或整数)或字符串,但 A 始终与 B 的类型相同。 运算符可以是 !=、==、>=、>、<=、<,甚至其他可以通过自己的类定义行为的运算符,这是我使用反射的另一个原因,因为我可以获取该字符串并使用反射调用适当的方法。
我希望(必须)避免分支“if”和“switch”,因为变化太多,并且会随着用户生成的输入而不断变化。
最佳答案
您可以创建一个工厂,为给定的输入返回正确的运算符。
public class OperatorFactory {
private static final Map<String, Operator<?>> OPERATORS = new HashMap<String, Operator<?>>();
static {
OPERATORS.put("<Number", new LessThanNumOperator());
OPERATORS.put("==Number", new EqualToNumOperator());
OPERATORS.put("<String", new LessThanStringOperator());
...
}
public static Operator<?> getOperator(String someUserSpecifiedOp, Class<?> paramType) {
String key = someUserSpecifiedOp;
if (Number.class.isAssignableFrom(paramType)) {
key += "Number";
} else if (String.class.isAssignableFrom(paramType)) {
key += "String";
}
return OPERATORS.get(key);
}
}
public interface Operator<T> {
public boolean execute(T lhs, T rhs);
}
public class LessThanNumOperator implements Operator<Number> {
public boolean execute(Number lhs, Number rhs) {
return lhs.doubleValue() < rhs.doubleValue();
}
}
然后使用它:
OperatorFactory.getOperator(userDesignatedOperation, lhs.getClass()).execute(lhs, rhs);
关于java - 如何创建动态 IF 语句?反射?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7418321/