java中的动态属性查找

时间:2013-08-20 01:37:01

标签: java reflection

Python有一种使用hasattr和getarr动态查找和检索对象属性的方法:

try:
    if hasattr(obj,name)
      thing = getattr(obj, name)
  except AttributeError:
    pass
  else:
    break

实现这个java的最有效(编码和性能)方法是什么? 我会序列化一个类的实例 - 随着时间的推移,属性可能会被添加到类中 因此,在检索时,我应该能够将getAttribute样式的API分发给客户端 - 并且仅当该特定版本支持该属性时才返回该属性。

2 个答案:

答案 0 :(得分:2)

执行此操作的最佳方法是使用反射来获取字段,使其可访问(如果它是私有的或者无法从当前范围访问),并获取与相关对象相关的值。

public static Object getAttribute(Object obj, String name) throws Exception {
    Field field = obj.getClass().getDeclaredField(name);
    field.setAccessible(true);
    return field.get(obj);
}

如果没有名为name的字段,则会引发NoSuchFieldException

答案 1 :(得分:1)

Vulcan的回答是正确的,但另一种选择是使用Apache's BeanUtils。例如,给定类:

public class Employee {
    public Address getAddress(String type);
    public void setAddress(String type, Address address);
    public Employee getSubordinate(int index);
    public void setSubordinate(int index, Employee subordinate);
    public String getFirstName();
    public void setFirstName(String firstName);
    public String getLastName();
    public void setLastName(String lastName);
}

你可以这样做:

Employee employee = ...;
String firstName = (String) PropertyUtils.getSimpleProperty(employee, "firstName");
String lastName = (String) PropertyUtils.getSimpleProperty(employee, "lastName");
... manipulate the values ...
PropertyUtils.setSimpleProperty(employee, "firstName", firstName);
PropertyUtils.setSimpleProperty(employee, "lastName", lastName);

或者:

DynaBean wrapper = new WrapDynaBean(employee);
String firstName = wrapper.get("firstName");

还有很多其他方法可以访问bean,比如为值创建Map属性。有关更多示例,请参阅user guide