给定一个任意的 POJO 类,我想拦截所有 setter 并在每个实例的基础上做一些“神奇的事情”。很自然地,我想到了AspectJ/AOP。
我定义了一个标记注释
我定义了一个具有
@Aspect
行为的 perthis()
来拦截所有 setter
我将其添加到
@Aspect
中,以将行为附加到标有 @MyInterface
的任何对象:
@DeclareParents(value = "@MyInterface *", defaultImpl = MyInterfaceImpl.class)
private MyObject myObject = null;
接口有这个方法:
Map<String, Object> getMagicStuff();
该方法在
MyInterfaceImpl
中实现
这一切都可以作为 POC,我可以做到:
((MyObject) obj).getMagicStuff();
但这很丑。我希望能够做到:
someObject.getMagicStuff();
我做了一些测试,如果我让 POJO 实现该接口,那么 AspectJ 不会“覆盖它”。
在完美的世界中,我会得到像 Lomboks
@Getter
这样的行为,但这需要 IntelliJ 支持,并需要使用 AST 树等。
我知道我可以在接口中定义默认方法,但无法访问实现。
有什么办法可以做到这一点吗?
简短的回答是:使用
@DeclareParents
或 @DeclareMixin
的注释风格方面需要遵守纯 Java 的规则,因此需要强制转换。如果您想避免强制转换,则需要使用 declare parents
来使用本机 AspectJ 语法,IDE 中的工具可能支持或不支持。但即使 IDE 标记了源代码,AspectJ 编译器 (ajc) 仍然会正确编译它。
资源:
为了更具体的答案,我还需要更具体的输入。