“干净地”将接口/类附加到任何类

问题描述 投票:0回答:1

给定一个任意的 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 树等。

我知道我可以在接口中定义默认方法,但无法访问实现。

有什么办法可以做到这一点吗?

java spring aspectj spring-aop
1个回答
0
投票

简短的回答是:使用

@DeclareParents
@DeclareMixin
的注释风格方面需要遵守纯 Java 的规则,因此需要强制转换。如果您想避免强制转换,则需要使用
declare parents
来使用本机 AspectJ 语法,IDE 中的工具可能支持或不支持。但即使 IDE 标记了源代码,AspectJ 编译器 (ajc) 仍然会正确编译它。

资源:

为了更具体的答案,我还需要更具体的输入。

© www.soinside.com 2019 - 2024. All rights reserved.