通过反射获取 HashMap

Get HashMap with Reflection

public class First {
    public final static Map<String, String> MAP = new HashMap<>();
    static {
        MAP.put("A", "1");
        MAP.put("B", "2");
    }
}

public class Second {
    public static void main(String[] args) {
        Class<?> clazz = Class.forName("First");
        Field field = clazz.getField("MAP");
        Map<String, String> newMap = (HashMap<String, String>) field.get(null); // Obviously doesn't work
    }
}

差不多。我可以毫不费力地获取 String 变量的示例值,但我坚持使用这个。尝试 google 它,失败了。此外,如果可能的话,我想在不实例化其 class.

的情况下获取此 Map

您唯一缺少的是处理以下异常:

  • Class.forName("第一个");
  • clazz.getField("地图");
  • field.get(空);

下面的代码从 First class 获取静态地图字段。这里我只是 throwing/propagating main 方法中的异常,但您应该相应地处理 try/catch 块中的异常。

class First {
  public final static Map<String, String> MAP = new HashMap<>();
  static {
    MAP.put("A", "1");
    MAP.put("B", "2");
  }
}


public class Second {
  public static void main(String[] args) throws IllegalArgumentException, IllegalAccessException,
      ClassNotFoundException, NoSuchFieldException, SecurityException {
    Class<?> clazz = Class.forName("First");
    Field field = clazz.getField("MAP");
    Map<String, String> newMap = (HashMap<String, String>) field.get(null); // Obviously doesn't work
    System.out.println(newMap); //Prints {A=1, B=2}
  }
}

这里是非静态的相同示例 class:

package at.noe.szb;
import static org.junit.Assert.assertEquals;
import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;
import org.junit.Test;

public class ReflectionTest {
    private class First {
        public Map<String, String> MAP = new HashMap<>();
        First(){
            MAP.put("A", "1");
            MAP.put("B", "2");
        }
    }
    @Test
    public void testMap() throws Exception {
        Class<?> clazz = Class.forName("at.noe.szb.First");
        Field field = clazz.getField("MAP");
        Map<String, String> newMap = (HashMap<String, String>) field.get(clazz);
        assertEquals("{A=1, B=2}", newMap.toString());
    }
}