我正在尝试获取对象的私有(private)字段的名称。当我对包的公共(public)字段使用相同的切入点时,它工作得很好。我的方面设置为特权。我想要更新类对象的字段。 切入点:
pointcut priv(Object v): target (v)&& !(call(new(..))) && set(private * *.*)
建议:
after(Object v): priv(v)
我在切入点内的这一行遇到异常 异常(exception):
Object dt = dts.getDeclaringType().getField(dts.getName());
最佳答案
首先,您的切入点没有意义,因为 set
切入点永远不可能与 call
切入点相同,因此您不需要排除它。如果您打算排除构造函数中的成员分配(这就是我的想法),您需要类似 !cflow(execution(*.new(..)))
来排除构造函数中的控制流。这只是一个示例,如果构造函数可能调用更改成员的方法(您可能不希望排除此类),您可能需要更精确地指定排除标准。
其次,我认为调用绑定(bind)目标v
相当难看,我宁愿将其称为target
或t
,如果有的话。但如果您打算将值绑定(bind)到 v
,而不是目标,则无论如何都必须使用 args(v)
。
现在你的实际问题是:正如 Javadoc 明确指出的那样,getField
仅适用于公共(public)字段。因此,如果您需要访问私有(private)字段,请使用getDeclaredField
。
关于java - 访问aspectj中的私有(private)字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15301307/