我正在尝试获取对象的私有字段的名称。当我对我的包的公共字段使用相同的切入点时,它的工作正常。我的方面设置为特权。我想要更新类对象的字段。 切入点:
pointcut priv(Object v): target (v)&& !(call(new(..))) && set(private * *.*)
建议:
after(Object v): priv(v)
我在切入点的这一行得到了一个例外 例外:
Object dt = dts.getDeclaringType().getField(dts.getName());
答案 0 :(得分:2)
首先,你的切入点没有意义,因为set
切入点永远不会与call
切入点相同,所以你不需要排除它。如果您打算在构造函数中排除成员赋值,这是我想的,您需要!cflow(execution(*.new(..)))
之类的东西来排除构造函数中的控制流。这只是一个示例,如果构造函数调用成员更改的方法(可能您不想排除等),则可能需要更准确地指定排除条件。
其次,我认为调用绑定目标v
相当丑陋,我宁愿称之为target
或t
,如果有的话。但是,如果您打算将值绑定到v
而不是目标,那么无论如何都必须使用args(v)
。
现在您的实际问题:正如Javadoc明确指出的那样,getField
仅适用于公共字段。因此,如果您需要访问私人字段,请使用getDeclaredField
。