Чтение статического поля интерфейса через отражение

У меня есть интерфейс:

public interface Interface {
public static final String FIELD1 = "BAR";
public static final String FIELD2 = "FOO";
.........
}

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

    Field[] fields = Interface.class.getFields();
    for (Field f : fields) {
          ............
    }

Проблема в том, что массив всегда имеет нулевую длину. Почему?

Изменить: я использую proguard, и я думаю, что проблема связана с обфускацией интерфейса.


person greywolf82    schedule 10.10.2015    source источник
comment
Возможно, поможет чтение только статических полей в Java   -  person Mick Mnemonic    schedule 10.10.2015
comment
У меня он отлично работает с тем кодом, который вы показали. Если вы можете воспроизвести это, пожалуйста, покажите это в короткой, но полной программе.   -  person Jon Skeet    schedule 10.10.2015
comment
какую версию java вы используете?   -  person flo    schedule 10.10.2015


Ответы (2)


Я использую тот же код, что и вы, и могу распечатать названия полей из интерфейса.

import java.lang.reflect.Field;

public class Prop {
  public static void main(String[] args)
  {
    Field[] fields = Interface.class.getFields();
    for (Field f : fields) {
      System.out.println(f.getName());
    }
  }
}

interface Interface {
  public static final String FIELD1 = "BAR";
  public static final String FIELD2 = "FOO";
}

Выход:

FIELD1  
FIELD2
person YoungHobbit    schedule 10.10.2015
comment
Это должен быть комментарий, а не ответ - вы просто говорите, что не можете воспроизвести проблему. Я согласен - и я не могу - но это означает, что на вопрос нельзя отвечать без редактирования. - person Jon Skeet; 10.10.2015
comment
Я согласен с тобой. Я сниму это. - person YoungHobbit; 10.10.2015
comment
Я не согласен ни с одним из вас. "Вы ошибаетесь" - такой же ответ, как и любой другой. - person user207421; 10.10.2015
comment
@EJP Приведенный выше код работает. Это было моим намерением показать ОП. Итак, как вы относитесь к этому ответу? - person YoungHobbit; 10.10.2015
comment
@EJP: Это никому не пригодится. Если вопрос был примерно таким: «Мое понимание полиморфизма состоит в том, что (xyz), то нет, вы ошибаетесь, это так ... полезно для будущих читателей. Когда в вопросе показан какой-то код и утверждается, что он ведет себя одним способом, тогда как на самом деле он ведет себя иначе, он не представляет никакой ценности для сайта - и ответ «Нет» также не дает никакого значения в качестве ответа. Что действительно обеспечивает ценность, так это то, что OP редактирует вопрос, чтобы на самом деле показать код, который ведет себя неправильно. - person Jon Skeet; 10.10.2015

Просто используйте:

Field[] fields = Interface.class.getDeclaredFields();

Вместо :

Field[] fields = Interface.class.getFields();

У меня все заработало!

person DiLDoST Wahag    schedule 19.10.2020