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