Установленное значение частного статического поля

Я хочу установить значение частного поля с помощью отражения для поблочного тестирования.

Проблема, то поле статично.

Вот то, от чего я работаю:

/**
   * Use to set the value of a field you don't have access to, using reflection, for unit testing.
   * 
   * Returns true/false for success/failure.
   * 
   * @param p_instance an object to set a private field on
   * @param p_fieldName the name of the field to set
   * @param p_fieldValue the value to set the field to
   * @return true/false for success/failure
   */
  public static boolean setPrivateField(final Object p_instance, final String p_fieldName, final Object p_fieldValue) {
    if (null == p_instance)
      throw new NullPointerException("p_instance can't be null!");
    if (null == p_fieldName)
      throw new NullPointerException("p_fieldName can't be null!");

    boolean result = true;

    Class<?> klass = p_instance.getClass();

    Field field = null;
    try {
      field = klass.getDeclaredField(p_fieldName);

      field.setAccessible(true);
      field.set(p_instance, p_fieldValue);

    } catch (SecurityException e) {
      result = false;
    } catch (NoSuchFieldException e) {
      result = false;
    } catch (IllegalArgumentException e) {
      result = false;
    } catch (IllegalAccessException e) {
      result = false;
    }

    return result;
  }

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

33
задан Tom Tresansky 13 July 2010 в 16:06
поделиться

2 ответа

В основном проблема заключается в вашем служебном методе, который предполагает, что у вас есть экземпляр. Довольно просто установить частное статическое поле - это точно такая же процедура, что и для поля экземпляра, за исключением того, что вы указываете null в качестве экземпляра. К сожалению, ваш служебный метод использует экземпляр для получения класса и требует, чтобы он не был нулевым ...

Я бы повторил предостережение Тома: не делайте этого. Если это класс, которым вы управляете, я бы создал метод уровня пакета:

void setFooForTesting(Bar newValue)
{
    foo = newValue;
}

Однако вот полный пример, если вы действительно, действительно хотите установить его с помощью отражения:

import java.lang.reflect.*;

class FieldContainer
{
    private static String woot;

    public static void showWoot()
    {
        System.out.println(woot);
    }
}

public class Test
{
    // Declared to throw Exception just for the sake of brevity here
    public static void main(String[] args) throws Exception
    {
        Field field = FieldContainer.class.getDeclaredField("woot");
        field.setAccessible(true);
        field.set(null, "New value");
        FieldContainer.showWoot();
    }
}
39
ответ дан 27 November 2019 в 18:33
поделиться

Просто передайте null в качестве аргумента экземпляра объекта. Итак:

field.set(null, p_fieldValue);

Это позволит вам установить статическое поле.

5
ответ дан 27 November 2019 в 18:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: