java - 访问aspectj中的私有(private)字段

标签 java aspectj pointcut

我正在尝试获取对象的私有(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相当难看,我宁愿将其称为targett,如果有的话。但如果您打算将值绑定(bind)到 v,而不是目标,则无论如何都必须使用 args(v)

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

关于java - 访问aspectj中的私有(private)字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15301307/

相关文章:

java - xml 布局的底部 View 未显示

java - 将 TextView 动态添加到相对布局。

java - 调用<aop :aspectj-autoproxy/> multiple times when loading spring context

java - 我是否应该使用 OVal(对象验证框架),即使它是否需要 AspectJ?

java - Spring AOP : @annotation() pointcut does not match type annotation

java - Tomcat JSP 错误 500

eclipse - 有没有办法在不使用 jvm 代理的情况下使用 Spring AspectJ LTW 运行 JUnit 4 测试?

java - Spring AspectJ 切点

java - Spring AOP忽略Hessian Service的一些方法

java - Neo4j - 对属性(property)存在的约束