Получить хэш-карту с отражением

#java #reflection #hashmap

#java #отражение #хэш-карта

Вопрос:

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

В значительной степени это. У меня нет проблем с получением, например, значений строковых переменных, но я застрял с этим. Попытался найти его в Google, не удалось. Кроме того, если возможно, я хотел бы получить эту карту без создания экземпляра ее класса.

Комментарии:

1. » // Obviously doesn't work » — Пожалуйста, укажите ошибки компиляции в вопросе.

Ответ №1:

Единственное, чего вам не хватает, это обрабатывать исключения для:

  • Class.forName(«Первый»);
  • clazz.getField(«КАРТА»);
  • field.get(null);

Приведенный ниже код получает поле статической карты из первого класса. Здесь я просто создаю / распространяю исключения в основном методе, но вы должны соответствующим образом обрабатывать исключения в блоке 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}
  }
}
  

Комментарии:

1. Да, оказывается, у меня только что была странная задержка ИДЕИ. Перезапустил его, и теперь все работает. Исключения были там, я просто забыл их написать (возникли проблемы с копированием вставок здесь)

Ответ №2:

Здесь тот же пример с нестатическим классом:

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