【问题标题】:Add inter-type public static method to classes向类添加类型间公共静态方法
【发布时间】:2023-03-25 05:38:01
【问题描述】:

在我的项目中,我有一组类(我不知道其名称和编号),我想向其中添加公共静态方法。

为简单起见,假设我想添加一个返回类的静态记录器实例的静态方法。唯一的要求是静态函数的调用方式如下:

public class Foo {
    private static final Logger LOG = LoggerFactor.getLogger(Foo.class);

    public static void main(String[] args) {
        Foo.getLogger().info("works!");
    }
}

因为我认为这是一个跨领域的问题,所以我想在这里解决我与 AspectJ 的问题,但我没有找到任何关于我的场景的信息。

我的问题是:

  • 这是否可能?
  • 如果可以,您如何实现?

我知道动态声明实现接口的类的父类的可能性,但后来我被卡住了,因为我无法在接口上生成静态方法:

public aspect StaticMethodAspect {

    public interface HasStaticMethod {}

    declare parents: ... implements HasStaticMethod;

    public static Logger HasStaticMethod.getLogger() { //aspect error
        ...
    }

}

我也知道this solution,但是不符合我对方法调用方式的要求。

感谢您的热情回复

【问题讨论】:

    标签: java static aop aspectj aspect


    【解决方案1】:

    如果你想通过 ITD 声明静态方法或成员,你需要知道类名,但你不是这种情况。所以你坚持做与你已经发现的事情相似的事情,在这里也可以看到我的答案:

    这些示例还展示了如何从另一个方面直接记录,因为通常记录也是一个横切关注点。因此,如果您可以避免手动记录,请使用我的方法。

    但是,如果您确实希望为每个目标类拥有一个静态记录器,并且确实按照示例代码显示的方式使用它,请使用 AspectJ 与注释处理的集成简要描述并链接到我在上面列表中的第一个答案。如果您不理解我在此处提供的两个链接中的示例代码,请随时提出后续问题。

    【讨论】:

    • 你好@kriegaex,我其实希望你能回答我!与方面文档一起,我在学习 aspectj 时阅读了您的几个答案(包括您提供的第二个和第三个链接)。话虽如此,我对第一个链接很感兴趣,特别是对注释处理:基本上它允许在给定特定注释的情况下动态生成方面?在readme ajc 中似乎需要注释,除了作为处理器。我的直觉正确吗?
    • 是的,如果我正确理解了您的问题。您使用(可能是自定义的)注释来注释目标类,例如@Log。然后,只要在构建的注释处理阶段发现带注释的类,就会触发您的处理器。处理器创建执行 ITD 的相应方面源代码文件,每个目标类一个。然后编译正常进行,所有的类和方面(包括 APT 生成的)都被编译和编织。您可以手动或通过 AspectJ Maven 插件执行此操作。
    • 我不太喜欢这种方法的唯一一点是,您实际上必须使用注释“污染”您自己的应用程序类,这些注释的唯一目的是被 AOP 相关的注释处理器拾取.我喜欢尽可能地将我自己的方面排除在我的应用程序源代码之外。但是目前 ITD 不能使用像普通切入点这样的类型名称模式,这是 AspectJ 的限制。我刚刚开始与邮件列表上的 AspectJ 主要维护者讨论这个问题,让我们看看他是怎么说的。
    • 很高兴听到这个问题带来了一些好处。与此同时,我会接受你的回答。我认为目前我的问题确实可以通过注释处理来解决。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-19
    • 1970-01-01
    • 1970-01-01
    • 2021-10-14
    • 2018-03-21
    • 1970-01-01
    相关资源
    最近更新 更多