Home > front end >  Create a hashmap with the names of the fields in the class as the key, and the values of those field
Create a hashmap with the names of the fields in the class as the key, and the values of those field

Time:07-30

Let's say you have a class: SomeClass with fields a=10, b=20, and c=30, where instanceOfSomeClass.getA()==10. I want a map like this

{
    a:10
    b:20
    c:30
}

I tried this, but got Class can not access a member of class with modifiers "private static final", but I also can't modify this class to not have private static final:

      Field[] fields = SomeClass.class.getDeclaredFields();
      for (Field f : fields) {
        map.put(f.toString(), f.get(instanceOfSomeClass).toString());
      }

Any ideas on how to make this hashmap?

CodePudding user response:

When you're looping through the Field objects, use Field.getModifiers() to determine each field's accessibility (public, private, static, etc).

As mentioned in the JavaDoc for Field.getModifiers(), use the class Modifier (which has static methods such as isFinal(), isPrivate(), etc) to "decode" the int value you get from getModifiers().

For example (untested pseudo-code):

for (Field f : fields) {
    int modifiers = f.getModifiers();
    if (Modifier.isStatic(modifiers)) {  // Skip static fields, for example
        break;
    }

    map.put(f.toString(), f.get(instanceOfSomeClass).toString());
}

CodePudding user response:

I guess this is your expected solution:

import java.lang.reflect.*;
import java.util.*;

class SomeClass {
    public static int a = 10;
    public static int b = 20;
    public static int c = 40;
}

class HelloWorld {
    public static void main(String[] args) {
        HashMap<String, String> map = new HashMap<String, String>();
        try{
            SomeClass sc = new SomeClass();
            
            Field[] fields = SomeClass.class.getDeclaredFields();
        
            for(int i = 0; i < fields.length; i  ) {

                // Getting the field's name and its value
                Object value = fields[i].get(sc);
                Object fieldName = fields[i].getName();

                // System.out.println("Field = "   fields[i].getName()   " Value = "   value   "\n");

                // Adding value into the HashMap
                map.put(fieldName.toString(), value.toString());
            }
            
        } catch (Exception e) {
            System.out.println(e.toString());
        }
        // Iterating through the HashMap
        for (Map.Entry<String, String> e : map.entrySet()) {
            System.out.println("Key: "   e.getKey()   " Value: "   e.getValue());
        }
    }
}

Output:

Key: a Value: 10
Key: b Value: 20
Key: c Value: 40
  • Related