21

在 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); ?
    }
    }
4

7 回答 7

21

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

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"); 
于 2013-08-04T16:35:44.913 回答
6

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

于 2013-08-04T16:27:38.867 回答
2

只要有问题的字段可以访问,bjc2406 的答案就可以正常工作:

t.getClass().getField(map.get(key)).get(t)

如果您不能合理地将其公开,反射和其他字段访问 API 应该可以完成工作:如何在 Java 中读取私有字段?

于 2017-12-31T11:41:37.110 回答
2

除此之外,
String org.apache.commons.beanutils.BeanUtils.getProperty(object, propertyName)

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

这可能有助于保留整数、小数和布尔类型。

于 2019-10-16T14:41:24.907 回答
0

问题是属性多久改变一次?是常数,还是取决于情况?

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

如果你使用像 spring 这样的框架,它也会附带处理属性的标准方法。查看他们的文档。

于 2013-08-04T16:40:32.383 回答
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) {
...
}
于 2020-05-13T16:44:17.110 回答
-3

你也可以去 Properties.java 类:http ://docs.oracle.com/javase/6/docs/api/java/util/Properties.html

它做同样的工作。

于 2013-08-04T16:33:37.520 回答