Что за ошибка в этом коде отражения? - PullRequest
0 голосов
/ 26 июля 2011

Мой недостаток Java снова кусает меня за пятки. У меня есть следующая функция-член:

protected void setData(Map<String, String[]> data) {
    Class thisClass = this.getClass();
    for(Map.Entry<String, String[]> item : data.entrySet()) {
        try {
            Field field = thisClass.getDeclaredField(item.getKey());
            try {
                if(field.getType().getName().equals("java.lang.Long")) {
                    // EXCEPTION HERE!!!
                    field.setLong(this, Long.valueOf(item.getValue()[0]) );
                }...
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        } catch (NoSuchFieldException e) {
            // Skip this field...
            continue;
        }
    }
}

Я продолжаю получать исключение IllegalArgumentException, и я не до конца понимаю, почему. Кто-нибудь может предложить некоторое понимание?

Функция берет карту, которую она повторяет, и присваивает значения «this», проверяя, существует ли поле в «this» и, если это так, пытается вызвать field.set().

Ответы [ 5 ]

3 голосов
/ 26 июля 2011

setLong(..) пытается установить примитивное значение, а ваши поля равны java.lang.Long.Всегда используйте метод set(..) для не примитивов.Для примитивов getType().getName() вернет int, long и т. Д.

Первоначальный ответ: Вам необходимо сделать поле доступным: field.setAccessible(true)

0 голосов
/ 27 июля 2011

Используйте field.set(this,Long.valueOf(item.getValue()[0]));, где item.getValue()[0] - длинное значение.

0 голосов
/ 26 июля 2011

Какую версию Java вы используете. Помните, что автобокс работает над версией 5.0. В соответствии с подробностями исключения, кажется, что вы пытаетесь присвоить объекту Long значение long (native). Вы можете попробовать это:

field.setLong(this, Long.valueOf(item.getValue()[0]).longValue());

надеюсь, это поможет.

0 голосов
/ 26 июля 2011

С помощью следующего кода я получаю только недопустимые исключения ARGUMENT - исключений недопустимого доступа:

import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;


public class Asdf2 {

    private Long long1;
    Long long2;
    protected Long long3;
    private long long4;
    Long long5;
    protected long long6;

    protected void setData(Map<String, String[]> data) {
        Class thisClass = this.getClass();

        for (Map.Entry<String, String[]> item : data.entrySet()) {

            try {
                Field field = thisClass.getDeclaredField(item.getKey());

                try {

                    field.setAccessible(true);

                    if (field.getType().getName().equals("java.lang.Long")) {
                        field.setLong(this, Long.valueOf(item.getValue()[0]));
                    } else {
                        field.set(this, item.getValue()); // EXCEPTION HERE!!!
                    }
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                } catch (IllegalArgumentException e) {
                    e.printStackTrace();
                }
            } catch (NoSuchFieldException e) {

                // Skip this field...
                continue;
            }
        }
    }

    @Override
    public String toString() {
        return "Asdf2["
            + "long1=" + long1
            + ",long2=" + long2
            + ",long3=" + long3
            + ",long4=" + long4
            + ",long5=" + long5
            + ",long6=" + long6
            + "]";
    }

    public static void main(String[] args) {
        Map<String, String[]> data = new HashMap<String, String[]>();
        data.put("long1", new String[] { "1" });
        data.put("long2", new String[] { "2" });
        data.put("long3", new String[] { "3" });
        data.put("long4", new String[] { "4" });
        data.put("long5", new String[] { "5" });
        data.put("long6", new String[] { "6" });

        Asdf2 test = new Asdf2();
        test.setData(data);
        System.out.println(test);

        System.out.println("Done!");
    }
}

Мои комментарии:

1) Если это Long, вы помещаете первый элемент значения (который является массивом) в это поле, но в противном случае вы помещаете весь массив - это будет работать, только если поля также являются строковыми массивами

2) Вы не опубликовали полученное вами исключение. Это может дать более подробную информацию?

3) Вам нужно дать нам класс "this", а не просто метод set, нам нужно как минимум увидеть определения полей.

0 голосов
/ 26 июля 2011

В соответствии с Field.set () docs , вы получаете IllegalArgumentException, если вы пытаетесь установить () значение в поле, значение которого не присваивается полю .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...