访问aspectj中的私有字段

时间:2013-03-08 18:59:41

标签: java aspectj pointcut

我正在尝试获取对象的私有字段的名称。当我对我的包的公共字段使用相同的切入点时,它的工作正常。我的方面设置为特权。我想要更新类对象的字段。 切入点:

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

建议:

after(Object v): priv(v)

我在切入点的这一行得到了一个例外 例外:

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

1 个答案:

答案 0 :(得分:2)

首先,你的切入点没有意义,因为set切入点永远不会与call切入点相同,所以你不需要排除它。如果您打算在构造函数中排除成员赋值,这是我想的,您需要!cflow(execution(*.new(..)))之类的东西来排除构造函数中的控制流。这只是一个示例,如果构造函数调用成员更改的方法(可能您不想排除等),则可能需要更准确地指定排除条件。

其次,我认为调用绑定目标v相当丑陋,我宁愿称之为targett,如果有的话。但是,如果您打算将值绑定到v而不是目标,那么无论如何都必须使用args(v)

现在您的实际问题:正如Javadoc明确指出的那样,getField仅适用于公共字段。因此,如果您需要访问私人字段,请使用getDeclaredField