1

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

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

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

4

2 回答 2

2

最好的方法是使用反射来获取字段,使其可访问(以防它是私有的或无法从当前范围访问),并获取与相关对象相关的值。

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

NoSuchFieldException如果不存在称为 的字段,则将抛出A name

于 2013-08-20T01:41:57.957 回答
1

Vulcan 的回答是正确的,但另一种选择是使用Apache 的 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为值创建一个属性。有关更多示例,请参阅用户指南

于 2013-08-20T02:27:08.583 回答