有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java使用表达式访问对象的属性值

考虑下面的代码:

Class Demo
{
    Person person = new Person("foo"); // assume Person class has a 'name' field.

    //Now, how do I get the value of a field, using some expression.
    String expression = "person.name";
}

现在,我想计算“expression”以获得“name”属性的值。有人能告诉我怎么做吗

-- 更新:“表达式”字符串我将从XML文件中获取它。那么,在该场景中是否也可以使用“反射”?“expression”字符串也可以深入到更深的层次,比如“person”。生日日期'


共 (6) 个答案

  1. # 1 楼答案

    Java中没有本机方法来实现这一点。还有多种其他选择

    一种方法是使用JXPath。这使用XPath样式的语法来查询对象。对于你来说,这可能有点过分,但毫无疑问是强大的

    例如,从JXPath主页:

    Address address = (Address)JXPathContext.newContext(vendor).
             getValue("locations[address/zipCode='90210']/address");
    

    它向给定的供应商对象询问其地址(给定邮政编码90210)。因此,您可以导航对象层次结构并提供谓词来执行“选择”。。WHERE'类型查询

    另见thisjava。net文章提供更多示例(我写的东西的无耻插件)

  2. # 2 楼答案

    “正确的”方法是让一个名为getName()的getter方法返回name的值

  3. # 3 楼答案

    您可以使用反射,尽管我建议像其他人建议的那样使用工具来解析表达式

    但是,如果您的表达式是简单的,您可以这样做:

    public static Object GetFieldValue(Object obj, String expr) throws SecurityException, NoSuchFieldException, IllegalAccessException {
        if (obj == null)
            throw new IllegalArgumentException("obj");
    
        if (expr == null || expr.isEmpty())
            throw new IllegalArgumentException("expr");
    
        String[] parts = expr.split("\\.");
    
        if (parts.length > 0) {
            Object currentFieldValue = obj;
    
            for (String fieldName : parts) {
                Field field = currentFieldValue.getClass().getDeclaredField(fieldName);
                field.setAccessible(true);
                currentFieldValue = field.get(currentFieldValue);
            }
    
            return currentFieldValue;
        }
    
        return null;
    }
    
  4. # 4 楼答案

    通常在Java中,您创建getter来检索此信息。但是,如果需要按名称获取字段的值,则应使用reflection

    然而,你的问题中有一点让我感到困扰,那就是你的问题更多地与设计有关,而不是与思考有关。你能告诉我们更多吗

  5. # 5 楼答案

    尽管可以使用反射来实现这一点(java.bean可能更有意义),但使用反射往往表示混淆

    你为什么要解释一些文本?你是故意写口译员吗?对person的引用真的应该被视为一个对象吗?告诉我们你的意图

  6. # 6 楼答案

    当然,您可以自己编写一个使用反射的解析器来完成这类工作,但是您也可以使用Spring的表达式求值语言,这非常接近您想要的(Documentation!)

    你可以用它做一些很酷的事情;它是一种功能强大的语言,类似于JSP的EL脚本(这也是一个选项)。你只需要给它一个上下文,在这个上下文中“person”意味着什么

    榜样

    public class DoStuff {
      class MyVariables {
        private person;
        public void getPerson() { return person; }
        public void setPerson(Person person) { this.person = person; 
      }
    
      public static Object eval( String input ) {
         MyVariables myVariables = new MyVariables();
         StandardEvaluationContext simpleContext = new StandardEvaluationContext(myVariables);
         ExpressionParser parser = new SpelAntlrExpressionParser();
         Expression exp = parser.parseExpression( input );
         return exp.getValue(context);
      }
    
      public static void main(String[] args) {
          String name = (String)eval("person.name");//woot!
      }
    
    }