在我的项目中,我有一组要为其添加公共静态方法的类(其名称和数字不是先验的)。
为简单起见,假设我要添加一个静态方法,该方法返回该类的静态记录器实例。唯一的要求是应按以下方式调用静态函数:
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,但是它不满足我对方法调用方式的要求。
感谢您的任何回复
答案 0 :(得分:1)
如果要通过ITD声明静态方法或成员,则需要知道类名,而您不知道这种情况。因此,您将坚持做与已经发现的事情类似的事情,在这里也请参阅我的答案:
这些示例还显示了如何从另一个方面直接进行日志记录,因为通常日志记录也是一个跨领域的问题。因此,如果您可以避免手动登录,请使用我的方法。
但是,如果您确实希望每个目标类都有一个静态记录器,并且确实按照示例代码显示的方式使用它,请使用 AspectJ集成和注释处理简要描述并链接到上面列表中我的第一个答案。如果您不理解我在此处提供的两个链接中的示例代码,请随时提出后续问题。