Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Reflection set field throws IllegalArgument


Автор: Larrr 15.7.2007, 17:46
Уважаемые, такой вопрос - хочу установить у класса поле в определенное значение, но процесс постоянно выкидывается с 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. Немного изменила пример. Суть не изменилась и ошибка тоже осталась.

Автор: LSD 15.7.2007, 18:44
А тип поля какой?

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

в моем тестируемом примере - int

Автор: Larrr 15.7.2007, 20:29
Пока что поставила заглушку с серией 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...Я где-то что-то пропустила?

Автор: niasilil 15.7.2007, 23:19
фигню написал, сорри

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

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

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

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)