Java - 评估以字符串形式给出的条件

时间:2016-09-30 04:35:08

标签: java reflection

所以我有一个由三部分组成的字符串:fieldNameoperatorvalue

假设参数具有以下值:

fieldName: firstName
operator: equals
value: Nikola

我希望能够在Java反射的帮助下评估firstName equals Nikola作为条件。这可能吗? if(obj.getFirstName().equals(value))

修改 Xenteros ):
根据评论中的讨论,我决定在问题中添加解释,因为MCVE应该在问题本身中:

问题描述:
有一个类有多个字段,所有字段都包含字符串。要求解决方案按字段名称获取字段值,并与另一个String进行比较。
有多个运营商可用。例如:<<=>=等,但也有equals可用,但不幸的是之前添加了"equals"。如果用户将equals传递给方法,则应调用User u

示例输入:
u.firstName.equals("John")"firstName""John"
"<="
true

预期产出:

$scope.generateExcelSheet=function(){ var uri = 'data:application/vnd.ms-excel;base64,' , template = '<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns="http://www.w3.org/TR/REC-html40"><head><!--[if gte mso 9]><xml><x:ExcelWorkbook><x:ExcelWorksheets><x:ExcelWorksheet><x:Name>{worksheet}</x:Name><x:WorksheetOptions><x:DisplayGridlines/></x:WorksheetOptions></x:ExcelWorksheet></x:ExcelWorksheets></x:ExcelWorkbook></xml><![endif]--></head><body><table>{table}</table></body></html>' , base64 = function(s) { return window.btoa(unescape(encodeURIComponent(s))) } , format = function(s, c) { return s.replace(/{(\w+)}/g, function(m, p) { return c[p]; }) } var table='exportable'; var name='Report'; if (!table.nodeType) table = document.getElementById(table) var ctx = {worksheet: name || 'Worksheet', table: table.innerHTML} window.location.href = uri + base64(format(template, ctx)); }

1 个答案:

答案 0 :(得分:1)

你问的是反思:

假设您有一个名为obj的对象。

Field field = obj.getClass().getField(fieldName);
Method method = field.getType().getMethod(operator, Object.class); //in case you mean method

if (method.invoke(field.get(), value) {}

请记住用try-catch包围它,因为有很多可能会抛出异常。

根据您对问题的更新,我建议如下:

boolean check(Object obj, String fieldName, String operator, String value) throws IllegalArgumentException, someOtherExceptions {
    Field field = obj.getClass().getField(fieldName);
    if (operator.equals("equals") {
        return field.get().equals(value);
    }
    if (operator.equals("<=")) {
        return field.get().compareTo(value) <=0;
    }
    if (operator.equals("<")) {
        return field.get().compareTo(value) < 0;
    //other operators impl.
    //at the end:
    throw new IllegalArgumentException("Unknown operator");
}

而不是Object obj你应该把包含'fieldName'可能引用的所有字段的类放在一起。