VictorGram
VictorGram

Reputation: 2661

Java : How to create map using the class attributes?

I am trying to create a map from all the attributes that a class have.My class looks like :

public class MyInventory
{
   private int tiers = 80;
   private int stearing =135;
   private int battery = 46;

 }

Now I have collected all the methods that the class has as :

Field[] fields = this.getClass().getDeclaredFields();

Now , I am trying to create a Map out of it where keys are the values of the fields and the values are the name of the fields. Example :

Map<46,battery> ...etc

Is there a way to do it? The attribute values for the above mentioned class were generated by mapping to properties file and by using spring annotation @ConfigurationProperties. Now I need to create the Map but keys the values of the attributes. I tried to use reflect. However did not find a way to get the value of the fields.

Thanks

Upvotes: 2

Views: 7407

Answers (4)

Uros Velickovic
Uros Velickovic

Reputation: 25

You can use json parser. For example jackson:

  import com.fasterxml.jackson.databind.ObjectMapper;
  ... 
  ObjectMapper mapper = new ObjectMapper();
  return mapper.readValue(mapper.writeValueAsString(fooOject), HashMap.class);

Upvotes: 0

Firman Wijaya
Firman Wijaya

Reputation: 186

You can use Introspector class.

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;
}

You can call the above method, passing your class as argument.

MyInventory mi = new MyInventory();
// Sets the properties of mi
mi.setXXX...
// Populates map
populateMap(mi);

Upvotes: 2

c0der
c0der

Reputation: 18792

  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;
   }

Of course it will not map properly if different fields have the same value.

Upvotes: 2

Ravi
Ravi

Reputation: 31417

I think, you can have getter method in your class

public class MyInventory
{
   private int tiers = 80;
   private int stearing =135;
   private int battery = 46;

   public int getBattery()
   {
       return battery;
   }
  //and other getter 
 }

and then you can populate your map as

map.put(inventory.getBattery(),"battery");

Because, when you have value, which means you know what is the type for which you are populating map.

Upvotes: 1

Related Questions