NoSuchFieldException при попытке получить значение поля

Я прочитал это сообщение и подписался на guidelines там. но это не помогло; Я получаю NoSuchFieldException, когда поле существует. Пример code ниже:

Вот мой код:

class A{
    private String name="sairam";
    private int number=100;
} 
public class Testing {
    public static void main(String[] args) throws Exception {
    Class cls = Class.forName("A");
    Field testnum=cls.getDeclaredField("number"); 
    testnum.setAccessible(true);
    int y = testnum.getInt(testnum);
    System.out.println(y);
    }
}

РЕДАКТИРОВАТЬ: за ответ ниже я пробовал это:

Class cls = Class.forName("A");
    Field testnum=cls.getDeclaredField("number");
    testnum.setAccessible(true);
    A a = new A();
    int y = testnum.getInt(a);
    System.out.println(y);

но ошибка такая же


person brain storm    schedule 03.03.2014    source источник


Ответы (3)


Параметр Object в Поле # getInt должно быть экземпляром class A.

A a = new A();
int y = testnum.getInt(a);

Поскольку поля name и number не статичны, вы не можете получить их из класса; вы должны получить их из определенного экземпляра класса.

person David Conrad    schedule 03.03.2014
comment
это не помогло. ты пробовал? - person brain storm; 04.03.2014
comment
Да, пробовал. Оно работает. Вам по-прежнему нужны другие части кода, например setAccessible(true). - person David Conrad; 04.03.2014
comment
Я пробовал. Оно работает. Вам нужно поместить новую строку в начало main и заменить строку int y = на предоставленную. - person Ted Bigham; 04.03.2014
comment
Не имеет значения, где находится новая строка, если она находится перед строкой int y =. - person David Conrad; 04.03.2014
comment
@DavidConrad: пожалуйста, посмотрите мою правку выше. Я пытался, как вы предлагали, но это не удалось. если мой код выше неправильный, вставьте то, что вы пробовали. - person brain storm; 04.03.2014
comment
Я просто скопировал код из вашего редактирования, и он работает у меня с Java 1.7.0_40. Какую ошибку вы получаете? Возможно ли, что у вас есть другой класс A. - person David Conrad; 04.03.2014
comment
Вы также можете использовать A.class или new A().getClass() вместо Class.forName("A"), чтобы убедиться, что вы получаете правильный класс. В какой строке выбрасывается исключение? - person David Conrad; 04.03.2014

Если ваш код в точности такой, как указано выше, NoSuchFieldException быть не должно. Но, вероятно, будет IllegalAccessException. Вы должны передать экземпляр класса getInt():

int y = testnum.getInt(cls.newInstance());
person helderdarocha    schedule 03.03.2014

Использовать

 int y = testnum.getInt(new A());

Вместо того

int y = testnum.getInt(testnum);

Поскольку методу требуется в качестве параметра объект (объект класса A, а не класса Field, который вы используете) для извлечения

person Ashot Karakhanyan    schedule 03.03.2014