Установленное значение частного статического поля
Я хочу установить значение частного поля, используя отражение для модульного тестирования.
Проблема в том, что это поле является статическим.
Вот от чего я работаю:
/**
* 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;
}
Я понимаю, что на SO, вероятно, уже был дан ответ, но мой поиск не стал...
Ответы
Ответ 1
В основном проблема заключается в вашем методе утилиты, который предполагает, что у вас есть экземпляр. Достаточно легко установить частное статическое поле - это точно такая же процедура, как для поля экземпляра, за исключением того, что вы указываете 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();
}
}
Ответ 2
Просто передайте null
для аргумента object-instance. Итак:
field.set(null, p_fieldValue);
Это позволит вам установить статическое поле.