2014-10-11 4 views
0

В настоящее время я изучаю отражение (независимо), я работаю с классом Field, и я выяснил, как получить имя и значение объявленной переменной; однако я хочу изменить переменную через объект Field, который я создаю. Вот мой код:Изменение примитивных типов данных через отражение

public void handleOutput() { 
    try { 
     Field f = getClass().getDeclaredField("test"); 
     f.setInt(int.class, 1); 
     System.out.println(f.getName()+": "+f.get(this)); 
     System.out.println("test: "+test); 
    } catch (IllegalAccessException | NoSuchFieldException e) { 
     e.printStackTrace(); 
    } 
} 

С помощью этого метода при том, что IllegalArgumentException выбрасывают:

Exception in thread "main" java.lang.IllegalArgumentException: Can not set int f 

IELD Main.test к java.lang.Class в sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException ( Неизвестный источник) at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException ( Неизвестный источник) at sun.reflect.UnsafeFieldAccessorImpl.ensureObj (Неизвестный источник) at sun.reflect.UnsafeIntegerFieldAccessorImpl.setInt (Неизвестный источник) на java.lang.reflect.Field.setInt (Неизвестный источник) на Main.handleOutput (Main.java:13) на Main.main (Main.java: 28) Нажмите любую клавишу, чтобы продолжить. , ,

Как изменить значение теста типа данных примитивного типа с использованием объявленного поля?

+0

Вы читали Javadoc? Что означает 'Field # set' в качестве первого аргумента? –

ответ

1

Похоже, вы имеете в виду

f.setInt(this, 1); 
+0

Вау, это довольно неловко. Я немного запутался во всем использовании этого ключевого слова в этом сценарии, не могли бы вы объяснить, почему эта строка кода работает? – Dan

+1

@Dan «Поле» является свойством класса «Class» не экземпляра. Чтобы внести изменения для конкретного экземпляра, вам необходимо передать экземпляр, который вы хотите применить в этом методе. В этом случае этот экземпляр такой же, как 'this', так что вы проходите. –