向类添加类型间公共静态方法

时间:2019-01-19 11:21:47

标签: java static aop aspectj aspect

在我的项目中,我有一组要为其添加公共静态方法的类(其名称和数字不是先验的)。

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

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,但是它不满足我对方法调用方式的要求。

感谢您的任何回复

1 个答案:

答案 0 :(得分:1)

如果要通过ITD声明静态方法或成员,则需要知道类名,而您不知道这种情况。因此,您将坚持做与已经发现的事情类似的事情,在这里也请参阅我的答案:

这些示例还显示了如何从另一个方面直接进行日志记录,因为通常日志记录也是一个跨领域的问题。因此,如果您可以避免手动登录,请使用我的方法。

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