2013-03-08 4 views
0

Я пытаюсь получить имя частного поля объекта. Когда я использую то же самое, что и для публичных полей моего пакета, он работает правильно. Мой аспект установлен на привилегированный. Я хочу, чтобы поля, в которых обновлялись объекты классов. Pointcut:Доступ к закрытым полям в аспекте

pointcut priv(Object v): target (v)&& !(call(new(..))) && set(private * *.*) 

Совет:

after(Object v): priv(v) 

я получаю исключение на этой линии в моем срезе точек Exception:

Object dt = dts.getDeclaringType().getField(dts.getName()); 
+0

Я знаю, что этот старый, но все еще указан как неотвеченный. Не могли бы вы согласиться и перенести мой ответ, если это будет уместно? Благодарю. – kriegaex

ответ

2

Прежде всего, ваш срез точки не имеет смысла, потому что a set pointcut никогда не может быть таким же, как call pointcut, поэтому вам не нужно его исключать. Если вы намерены исключить назначения членов в конструкторах, что я и предполагаю, вам нужно что-то вроде !cflow(execution(*.new(..))), чтобы исключить потоки управления внутри конструкторов. Это просто пример, вам может потребоваться уточнить критерий исключения, если это может случиться, что конструктор вызывает метод, когда члены меняются, что, вероятно, вы не хотите исключать и т. Д.

Во-вторых, я думаю, что это довольно уродливо, чтобы вызвать связанный объект v, я бы скорее назвал его target или t, если угодно. Но если вы намерены привязать значение к v, а не к цели, вы должны использовать args(v) в любом случае.

Теперь ваша фактическая проблема: Как явно говорит Javadoc, getField работает только в общественных местах. Поэтому, если вам нужно получить доступ к частному полю, используйте getDeclaredField.

Смежные вопросы