Отражение: постоянные переменные в классе, загруженные с помощью отражения - PullRequest
4 голосов
/ 14 ноября 2011

У меня есть класс, в котором есть куча константных строк.

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

controllerClass = Class.forName(constantsClassName);
Object someclass = controllerClass.newInstance();

но я не совсем понимаю, как получить поля в этом классе.

Ответы [ 4 ]

5 голосов
/ 14 ноября 2011

Быстрый пример доступа к полям -

Field[] fields = controllerClass.getDeclaredFields();

for ( Field field : fields ) {
   field.setAccessible(true);
  System.out.println(field.get(someClass));

}
2 голосов
/ 14 ноября 2011

Вот небольшой пример:

import java.lang.reflect.Field;

public class Test {
    public static class X {
        public static int Y = 1;
        private static int Z = 2;

        public int x = 3;
        private int y = 4;
    }

    public static Object getXField(String name, X object) {
        try {
            Field f = X.class.getDeclaredField(name);

            f.setAccessible(true);

            return f.get(object);
        } catch (Exception e) {
            e.printStackTrace();

            return null;
        }
    }

    public static void main(String[] args) {
        System.out.println(Test.getXField("Y", null));
        System.out.println(Test.getXField("Z", null));

        System.out.println(Test.getXField("x", new X()));
        System.out.println(Test.getXField("y", new X()));
    }
}

Запуск этой маленькой программы выводит:

1
2
3
4

Несколько замечаний:

  • Для статических полей предоставляемый объект для Field.get() может быть null.

  • Для краткости я использовал всеобъемлющее исключение с базовым классом Exception - вы должны использовать явные классы исключений в своем коде.

  • Хотя Field.get() обычно работает как положено, этого нельзя сказать о Field.set() и его друзьях. Более конкретно, он с радостью изменит значение константы (например, поле final или поле private, которое никогда не изменяется в методах класса), но из-за встраивания константы старое значение может оставаться в использовании.

1 голос
/ 14 ноября 2011

Предполагая, что эти константы находятся в статических полях:

import java.lang.reflect.*;

public class Reflect {
  public static final String CONSTANT_1 = "1";
  public static final String CONSTANT_2 = "2";
  public static final String CONSTANT_3 = "3";

  public static void main(String[] args) throws Exception {
    Class clazz = Class.forName("Reflect");
    Field[] fields = clazz.getDeclaredFields();
    for(Field f: fields) {
      // for fields that are visible (e.g. private)
      f.setAccessible(true);

      // note: get(null) for static field
      System.err.printf("%s: %s\n",f, (String)f.get(null) );
    }
  }
}

Вывод:

$ java Reflect
public static final java.lang.String Reflect.CONSTANT_1: 1
public static final java.lang.String Reflect.CONSTANT_2: 2
public static final java.lang.String Reflect.CONSTANT_3: 3

Обратите внимание, что для получения значения статического поля вы указываете null как аргумент.

0 голосов
/ 14 ноября 2011

Вы узнаете о модификаторах через класс, а не ссылку на объект.

http://download.oracle.com/javase/tutorial/reflect/class/classModifiers.html

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