Java:如何使用类属性创建地图?

时间:2018-10-12 03:26:41

标签: java

我试图根据一个类的所有属性创建一个映射。我的类看起来像:

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,但是要设置属性的值。我尝试使用反射。但是没有找到获取字段值的方法。

谢谢

4 个答案:

答案 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);