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); ?
}
}
答案 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
它做同样的工作。