Android Java, как получить значение атрибута класса? - PullRequest
0 голосов
/ 14 января 2020

Я хочу получить значение атрибута класса, но получаю исключение: java .lang.NoSuchFieldException

Person.class

public class Person {

    public static final String name = "person name";

}

MainActivity.class

...

private void method() {

    Class myClass = Person.class;

    String name = myClass.getField("name");

}

...

Я получаю исключение java .lang.NoSuchFieldException для метода getField.

Я пробовал эти решения, но безрезультатно ...

  1. Измените метод getField на getDeclaredField

  2. Окружите код методом try / catch и получили еще одну ошибку ( Несовместимые типы: java .lang.String и java .lang.reflect.Field)

  3. Invalidate Android Studio кэши и перезапуск

Я не знаю, как получить доступ к этому значению. Любые решения или предложения приветствуются.

Заранее спасибо.

Ответы [ 5 ]

1 голос
/ 14 января 2020
  1. Если ваша переменная в классе "Person" имеет статус c:
    (на мой взгляд, это не лучшее решение)

    Объяснение: метод getField возвращает поле типа " msgstr "так что вы НЕ МОЖЕТЕ сохранить в переменную другого типа без преобразования.
    YourField.get возвращает объект, поэтому вы НЕ МОЖЕТЕ сохранить в переменную другого типа без преобразования.

try{
    Class _person = Person.class;
    Field field = _person.getField("name");
    Object value = field.get(null);
    String valueString = (String)value; /*The String you are looking for*/
}catch (Exception e) {
    //TODO handle exception
}

Если ваша переменная в классе "Person" имеет статус c:
    String valueString = Person.name /*The value you are looking for*/

Если ваша переменная не stati c, а publi c:
ВАЖНО (Если вы не установили значение по умолчанию для переменной):
В этом случае значением будет пустая строка потому что вы создаете новый экземпляр вашего статуса. Вы можете установить "имя человека" в конструкторе вашего класса Person другим способом, которым вы получите пустую строку, потому что переменная не stati c.
    Person _person = new Person();
    String personName = _person.name;

1 голос
/ 14 января 2020

Если вы хотите получить доступ к значению поля, вы можете использовать метод get(...) с нулевым аргументом - так как это поле stati c, оно не требует какого-либо экземпляра:

private void method() {

    Class myClass = Person.class;

    Field field = myClass.getField("name");
    String name = field.get(null);

    Log.d("Test", "field value: " + name);
}

В вашем случае не имеет значения, используете ли вы getField(...) или getDeclaredField(...). Вы можете использовать последний, если хотите захватить поле в его суперклассе или интерфейс, реализованный вашим классом.

Например, если Person должен был расширяться из класса, имеющего поле с именем sample, вам нужно будет использовать getDeclaredField("sample") вместо.

1 голос
/ 14 января 2020

Измените метод getField на getDeclaredField

Окружите код методом try / catch и получили другую ошибку (Несовместимые типы: java .lang.String и java .lang.reflect.Field )

потому что getDeclaredField вернет объект типа Field, а не String, просто измените свой код на

Field field = myClass.getDeclaredField("name");
//do something with field
0 голосов
/ 14 января 2020

Это константа состояния c. Stati c означает, что одновременно возможно только одно значение. Или произнесите это так: атрибут класса 'name' является атрибутом class , а не атрибутом объекта! Атрибут принадлежит классу!

Так что вам не нужно создавать экземпляр вашего класса Person.

Вы можете просто использовать:

String name = Person.name;

Помните: это работает только потому, что имя принадлежит классу. И это так, потому что вы объявили свою переменную имени stati c.

0 голосов
/ 14 января 2020

Поскольку вы объявили эту константу, обращайтесь к ней напрямую с помощью имени класса, как показано ниже,

String name = Person.name;
...