0

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

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

建议:

after(Object v): priv(v)

我的切入点异常中的这一行出现异常:

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

1 回答 1

2

首先,你的切入点没有意义,因为一个set切入点永远不可能和一个call切入点相同,所以你不需要排除它。如果您打算排除构造函数中的成员分配,这就是我的假设,您需要!cflow(execution(*.new(..)))排除构造函数中的控制流。这只是一个示例,您可能需要更精确地指定排除标准,如果构造函数调用成员更改的方法,您可能不想排除等。

其次,我认为调用绑定目标是相当难看的v,我宁愿调用它target或者t,如果有的话。但是,如果您打算将值绑定到,而不是目标,则无论如何v都必须使用。args(v)

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

于 2013-03-15T13:24:16.707 回答