Python有一种使用hasattr和getarr动态查找和检索对象属性的方法:
try:
if hasattr(obj,name)
thing = getattr(obj, name)
except AttributeError:
pass
else:
break
实现这个java的最有效(编码和性能)方法是什么? 我会序列化一个类的实例 - 随着时间的推移,属性可能会被添加到类中 因此,在检索时,我应该能够将getAttribute样式的API分发给客户端 - 并且仅当该特定版本支持该属性时才返回该属性。
答案 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。