问题 Java按属性名称获取属性值


在Java中是否可以通过其名称获取类属性值? 例如,我喜欢上课

public class Test {
    private String field;
    public String getField() {...}
    public void setField() {...}
}

还有另一个有Map的课程

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

7149
2017-08-04 16:19


起源

是。这就是“Reflection API”的用途。 - qqilihq


答案:


您可以使用一些提供基于属性的访问的库。我认为最知名和最常用的是 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"); 

11
2017-08-04 16:35



有一个问题 BeanUtils.getProperty :它返回一个字符串。如果你有另一种类型的财产,不清楚该怎么办。 - Alexey
尝试在Object引用中获取它,例如 Object oldname = BeanUtils.getProperty(someBean,"name"); 在int的情况下,bool它将作为包装类对象。然后尝试检查类型以进行所需的进一步操作 - Koushik Chatterjee


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


5
2017-08-04 16:27



java.lang.NoSuchFieldException - Ken


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

t.getClass()。getfield命令(map.get(密钥))。得到(T)

如果您无法合理地公开它,反射和其他现场访问API应该完成工作: 如何在Java中读取私有字段?


1
2017-12-31 11:41





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

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

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


0
2017-08-04 16:40



OP不是要求属性文件中的属性,而是要求JavaBean属性的值。 - Stefan Haberl


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

它做同样的工作。


-2
2017-08-04 16:33



OP不是要求属性文件中的属性,而是要求JavaBean属性的值。 - Stefan Haberl
@StefanHaberl:我建议一个替代解决方案。 OP尝试实现的目标也可以通过Properties.java实现 - Lokesh