質問

I am trying to get the name of the private field of an object. When i use the same point-cut for the public fields of my package it works just right. My aspect is set to privileged. I want the fields where the classes' objects are updated. Pointcut:

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

Advice:

after(Object v): priv(v)

i get an exception on this line within my pointcut Exception:

Object dt = dts.getDeclaringType().getField(dts.getName());
役に立ちましたか?

解決

First of all, your pointcut does not make sense because a set pointcut can never be the same as a call pointcut, so you do not need to exclude it. If you intend to exclude member assignments in constructors, which is what I suppose, you need something like !cflow(execution(*.new(..))) to exclude control flows within constructors. This is just an example, you may need to specify your exclusion criterion more precisely if it can happen that a constructor calls a method where members are changed, which probably you do not want to exclude etc.

Secondly, I think it is rather ugly to call a bound target v, I would rather call it target or t, if anything. But if you intend to bind the value to v, not the target, you must use args(v) anyway.

Now your actual problem: As the Javadoc explicitly says, getField only works on public fields. So if you need to access a private field, please use getDeclaredField.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top