Java отражение - получить переменную класса, передавая имя - PullRequest
0 голосов
/ 27 января 2020

У меня есть класс (это Singleton в моем проекте) с некоторыми переменными. Я хотел бы получить одну из этих переменных, передав ее имя в функции. На данный момент у меня есть:

public final class Configuration {
   private static volatile Configuration instance = null;
   //Here usual code to instanciate singleton

   String var1;
   int var2;
   boolean var3;

   public static Object Get(String varname)throws IllegalArgumentException, IllegalAccessException {
       for(Field field : instance.getClass().getFields())
            if(field.getName() == varname) 
                return field.get(field);
       return null;
   }

}

Из отладчика я знаю, что instance.getClass().getFields() возвращает пустое Field[], но я не понимаю, почему.

Ответы [ 2 ]

3 голосов
/ 27 января 2020

Вы, вероятно, не хотите этого делать. Но ладно,

Вы сравниваете строки и другие четко определенные объекты, как это:

boolean b = java.lang.Objects.equals(a, b)

Кроме того, getFields предоставляет только публичные c поля. См. В чем разница между getFields и getDeclaredFields в Java отражении

В стороне: старайтесь не возвращать ноль. Предпочитаю java.lang.Optional<T> или сгенерируем исключение

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

Помимо вашей ошибки при сравнении строк (вы должны использовать .equals, а не ==, хотя == часто будет работать.) У вас также есть проблема с выражением field.get (field). Это получит значение из объекта поля, у которого не будет поля с именем varname. Вы, вероятно, хотите field.get (экземпляр). Даже если это исправить, я не совсем уверен, что он будет делать с примитивными значениями - int и boolean - но я полагаю, что они преобразуют их в Integer и Boolean соответственно, если это что-то сделает.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...