Java按属性名称获取属性值

时间:2013-08-04 16:19:44

标签: java object properties

Java中是否可以通过名称获取类属性值? 例如,我有像

这样的课程
public class Test {
    private String field;
    public String getField() {...}
    public void setField() {...}
}

和另一个带地图的课程

public class Main {
    private static final Map<String, Long> map = new HashMap<String, Long>();
    static {
        map.put("field", new Long(1));
    }
    public void doSth() {
    Set<String> keys = map.keySet();
    Test t = new Test();
    for (String key : keys) {
    //t.getPropertyValueByName(key); ?
    }
    }

7 个答案:

答案 0 :(得分:12)

您可以使用一些提供基于属性的访问的库。我认为最知名和最常用的是beanutils。你可以找到一个很好的beanutils“in action”here的例子。 一些示例代码:

A someBean = new A();

// access properties as Map
Map<String, Object> properties = BeanUtils.describe(someBean);
properties.set("name","Fred");
BeanUtils.populate(someBean, properties);

// access individual properties
String oldname = BeanUtils.getProperty(someBean,"name");
BeanUtils.setProperty(someBean,"name","Barny"); 

答案 1 :(得分:5)

是。您可以使用t.getClass()。getField(map.get(key))。get(t)替换注释掉的行。这将检索t上的字段值。

答案 2 :(得分:1)

只要可以访问相关字段,

bjc2406的答案就可以正常运行:

  

t.getClass()。getfield命令(map.get(键))。得到(t)的

如果您无法合理地将其公开,那么反思和其他字段访问API应该完成工作:How do I read a private field in Java?

答案 3 :(得分:1)

除了
String org.apache.commons.beanutils.BeanUtils.getProperty(object, propertyName)

Object org.apache.commons.beanutils.PropertyUtils#getProperty(object, propertyName)
不会将值转换为字符串。

这可能有助于保留整数,十进制和布尔类型。

答案 4 :(得分:0)

问题是这些属性的变化频率如何?是常数,还是取决于具体情况?

如果是后一种情况(通常是这种情况),则需要外部文件中的属性。标准的java属性api很适合:http://docs.oracle.com/javase/7/docs/api/java/util/Properties.html

如果您使用像spring这样的框架,它还会提供处理属性的标准方法。查看他们的文档。

答案 5 :(得分:0)

此解决方案有效:

// access individual properties
String oldname = BeanUtils.getProperty(someBean,"name");
BeanUtils.setProperty(someBean,"name","Barny"); 

此解决方案变体保留对象的类型

Object a = BeanUtilsBean.getInstance().getPropertyUtils().getNestedProperty(someBean, "name");
if(a instanceof Boolean) {
...
}

答案 6 :(得分:-2)

您也可以使用Properties.java类:http://docs.oracle.com/javase/6/docs/api/java/util/Properties.html

它做同样的工作。