Java - Reflection: получить поля, принадлежащие только текущему классу - PullRequest
2 голосов
/ 20 февраля 2012

Как я могу получить поля, связанные только с текущим классом, а не со всеми его родительскими классами?

public class BaseClass()
{
     public int x = 0;
}

public class AnotherClass() extends BaseClass
{
     public int y = -1;
     public int z = -2;

     public void doStuff()
     {
          for(Field f : this.getClass().getFields())
          {
              //Save each field to a file
          }
     }
}

Я хочу получить только Y и Z, принадлежащие AnotherClass.Но вышесказанное дает мне и X.

Это предназначено для того, чтобы заменить необходимость вводить каждое значение, которое я хочу сохранить.Это не сохраняется в каком-либо типичном формате.Это должно быть сохранено, как это, поэтому не предлагайте сохранять поля другим способом.

Фильтрация имени каждого поля отрицательно скажется на этом, поскольку их более 200.

Ответы [ 4 ]

7 голосов
/ 20 февраля 2012

Вы можете получить только поля, объявленные в классе с помощью getDeclaredFields. Это исключит унаследованные поля.

2 голосов
/ 20 февраля 2012

Вы можете фильтровать, основываясь на Field getDeclaredClass():

public static List<Field> fieldsDeclaredDirectlyIn(Class<?> c) {
    final List<Field> l = new ArrayList<Field>();
    for (Field f : c.getFields())
        if (f.getDeclaringClass().equals(c))
            l.add(f);
    return l;
}

. Для вашего примера это просто y и z.

1 голос
/ 20 февраля 2012

Использование public Field[] getDeclaredFields()

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

      Field[] fields = AnotherClass.class.getDeclaredFields();
      for(Field f : fields){
          System.out.println(f.getName());
      }
1 голос
/ 20 февраля 2012

Может быть более чистый способ сделать это с помощью флагов для какой-либо функции, но очевидный ответ (и то, что я делал в прошлом) - найти разницу между массивами this.getClass().getFields() и super.getClass().getFields().

...