Сравните объект с примитивным типом - PullRequest
0 голосов
/ 02 января 2019

Я хотел бы выполнить проверку безопасности для моего getClass().getField(...).set(...), где значение, которое я задаю, должно соответствовать типу этого поля (int x = 1 должно позволять устанавливать только целые числа). Проблема в том, что мне трудно найти способы сравнить их. В настоящее время это код:

int foo = 14;

Field field = getClass().getDeclaredField("foo");
Object source = this;

// make the field accessible...

public void safeSet(Object newValue) throws IllegalAccessException {
    // compare the field.getType() to the newValue type
    field.set(source, newValue);
}

Я много чего перепробовал и довольно долго искал в интернете, но не могу найти ответ, который фокусируется исключительно на его использовании. Я пробовал такие вещи, как field.getType().getClass().equals(newValue.getClass()), field.getType().equals(newValue) и другие, и они не работают. Как я могу разумно сравнить примитивное field.getType () со значением Object, переданным в, или, как бы я в этом случае сравнил int с Integer?

Ответы [ 2 ]

0 голосов
/ 02 января 2019

Ваш друг Class.isAssignableFrom ()

Поскольку вы хотите присвоить значение полю, это встроенное решение для этого.

if (getClass().getDeclaredField("foo").getType().isAssignableFrom(newValue.getClass())) {
    ....
}

Работает и для примитивных типов.

0 голосов
/ 02 января 2019

Шаг 1: Проверьте field.isPrimitive().Если он возвращает true, то это примитивный тип.и перейдите к шагу 3.

Шаг 2: Если он не примитивен, вы можете напрямую проверить field.getType() == newValue.getClass() и затем установить значение

Шаг 3: если он примитив, то вам нужно иметьстатическая карта

public final static Map<Class<?>, Class<?>> map = new HashMap<Class<?>, Class<?>>();
static {
    map.put(boolean.class, Boolean.class);
    map.put(byte.class, Byte.class);
    map.put(short.class, Short.class);
    map.put(char.class, Character.class);
    map.put(int.class, Integer.class);
    map.put(long.class, Long.class);
    map.put(float.class, Float.class);
    map.put(double.class, Double.class);
}

Class<?> clazz = map.get(field.getType());
then check clazz == newValue.getClass() and then set the variable.
...