java - 如何创建动态 IF 语句?反射?

标签 java reflection dynamic if-statement

是否可以通过反射创建动态 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/

相关文章:

C# 如何在不知道您使用的是哪个 poco 的情况下将 Poco 转换为 List<Poco>

c# - 使用动态文件名读取存储在资源文件 (resx) 中的字符串

java - 您能解释一下java中的连接池吗?连接池是否有默认大小?

java - 从 FFmpeg 解析 BufferedImages 的 ArrayList

java - 如何设置 log4j2 asyncQueueFullPolicy

java - 我的 isEmpty 方法不起作用,我不知道为什么

java - 如何在freemarker模板中调用反射方法?

c# - 动态访问给定命名空间的类

javascript - 如何使用 jquery 滚动到具有动态 id 的元素

jquery - 如何在 jquery 中将一个 div 的最小高度更改为另一个 div 的高度 - 代码不起作用