我试图根据一个类的所有属性创建一个映射。我的类看起来像:
public class MyInventory
{
private int tiers = 80;
private int stearing =135;
private int battery = 46;
}
现在,我收集了该类具有的所有方法:
Field[] fields = this.getClass().getDeclaredFields();
现在,我试图用它创建一个Map,其中key是字段的值,而值是字段的名称。示例:
Map<46,battery> ...etc
有办法吗? 上述类的属性值是通过映射到属性文件并使用spring批注@ConfigurationProperties生成的。现在,我需要创建Map,但是要设置属性的值。我尝试使用反射。但是没有找到获取字段值的方法。
谢谢
答案 0 :(得分:1)
我认为,您可以在类中使用getter方法
public class MyInventory
{
private int tiers = 80;
private int stearing =135;
private int battery = 46;
public int getBattery()
{
return battery;
}
//and other getter
}
然后您可以将地图填充为
map.put(inventory.getBattery(),"battery");
因为,当您拥有价值时,这意味着您知道要为其填充地图的类型。
答案 1 :(得分:1)
您可以使用Introspector
类。
public Map<Object, String> populateMap(final Object o) throws Exception {
Map<Object, String> result = new HashMap<>();
for (PropertyDescriptor pd : Introspector.getBeanInfo(o.getClass()).getPropertyDescriptors()) {
String fieldName = pd.getName();
if("class".equals(fieldName) continue;
Object value = pd.getReadMethod().invoke(o);
result.put(value, fieldName);
}
return result;
}
您可以调用上述方法,并将您的类作为参数传递。
MyInventory mi = new MyInventory();
// Sets the properties of mi
mi.setXXX...
// Populates map
populateMap(mi);
答案 2 :(得分:1)
Map<Integer, String> map() throws IllegalArgumentException, IllegalAccessException {
Field[] fields = getClass().getDeclaredFields();
Map<Integer,String> map = new HashMap<>();
for (Field field : fields) {
map.put(field.getInt(this), field.getName());
}
return map;
}
当然,如果不同的字段具有相同的值,它将无法正确映射。
答案 3 :(得分:0)
您可以使用 json 解析器。例如杰克逊:
import com.fasterxml.jackson.databind.ObjectMapper;
...
ObjectMapper mapper = new ObjectMapper();
return mapper.readValue(mapper.writeValueAsString(fooOject), HashMap.class);