Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Reflection set field throws IllegalArgument, что-то я не понимаю что делать.... 
V
    Опции темы
Larrr
Дата 15.7.2007, 17:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 128
Регистрация: 29.1.2006
Где: Прага

Репутация: нет
Всего: 2



Уважаемые, такой вопрос - хочу установить у класса поле в определенное значение, но процесс постоянно выкидывается с java.lang.IllegalArgumentException.

Код

public class A
{
    private int i = 5;
    private String j = "Ahoj";
}


Код

public class B
  {
    private A    test;

    public B ()
    {
        test = new A ();
    }

    public void changeA (String val)
    {
        String    propertyname = "i";
        Class    c            = this.test.getClass ();
        Field    f            = isThereField (c, propertyname);

        if (f != null)
        {
            try
            {
                f.setAccessible (true);
                f.set (this.test, val);
            } catch (Exception ex)
            {
                System.out.println (ex.toString ());
            }
        }
    }

    private Field isThereField (Class c, String property)
    {
        Field    field  = null;

        Field[]    fields = c.getDeclaredFields ();

        for (int i = 0; i < fields.length; i++)
        {
            if (fields [i].getName ().equals (property))
            {
                field = fields [i];

                break;
            }
        }

        return field;
    }

    public static void main (String[] args)
    {
        B    b = new B ();

        b.changeA ("20");
    }
  }


На  f.set (this.test, val); все падает с java.lang.IllegalArgumentException. Дебаг говорит, что объект test в порядке, val тоже.
Поиски в нете дали такой результат:
"A Field permits widening conversions to occur during a get or set access operation, but throws an IllegalArgumentException if a narrowing conversion would occur.", только я не совсем понимаю отсюда 1) в чем проблема 2) что мне надо сделать чтобы ее устранить... smile . Подскажите кто может  smile

PS. Немного изменила пример. Суть не изменилась и ошибка тоже осталась.

Это сообщение отредактировал(а) Larrr - 15.7.2007, 19:58
PM MAIL WWW ICQ   Вверх
LSD
Дата 15.7.2007, 18:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



А тип поля какой?


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Larrr
Дата 15.7.2007, 19:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 128
Регистрация: 29.1.2006
Где: Прага

Репутация: нет
Всего: 2



Цитата(LSD @ 15.7.2007,  18:44)
А тип поля какой?

в моем тестируемом примере - int
PM MAIL WWW ICQ   Вверх
Larrr
Дата 15.7.2007, 20:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 128
Регистрация: 29.1.2006
Где: Прага

Репутация: нет
Всего: 2



Пока что поставила заглушку с серией if:

Код

f.setAccessible (true);
            Class type = f.getType();
            if(type.getName().equals("int"))
            {
                int i = new Integer(val);
                f.setInt (this.test, Integer.parseInt(val));
            }
            ...




Походу возник такой вопрос - почему не работает

Код

if(type == Integer.class)


При дебаге type у меня type: java.lang.Class = {java.lang.Class@80}"int", то есть никак не Integer.class...Я где-то что-то пропустила?
PM MAIL WWW ICQ   Вверх
niasilil
Дата 15.7.2007, 23:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 325
Регистрация: 4.6.2007
Где: USA

Репутация: 8
Всего: 9



фигню написал, сорри

Это сообщение отредактировал(а) niasilil - 15.7.2007, 23:22


--------------------
SCJP 5.0, SCJD
PM MAIL   Вверх
nornad
Дата 16.7.2007, 00:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1079
Регистрация: 16.2.2007
Где: в Караганде

Репутация: 16
Всего: 31



Цитата(Larrr @  15.7.2007,  23:29 Найти цитируемый пост)
Походу возник такой вопрос - почему не работает

Выделить всёкод Java
1:
    
if(type == Integer.class)

А с чего бы должно? int и Integer -разные типы. Один встроенный, а другой - объектная обёртка.


--------------------
Три достоинства программиста: Леность, Нетерпение и Гордость
Ларри Уолл
PM MAIL WWW ICQ Skype MSN   Вверх
LSD
Дата 16.7.2007, 08:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



1. Есть два разных класса, один для примитивного типа int, второй для java.lang.Integer.
2. Естественно у тебя возникает ошибка, ты же полю типа int пытаешься присвоить String. Автоматически конвертируются только Integer -> int и все. Тебе надо использовать Integer.parseInt().


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0737 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.