将类型间 public 静态方法添加到 类
Add inter-type public static method to classes
在我的项目中,我有一组 classes(我不知道其名称和编号),我想向其添加一个 public 静态方法。
为简单起见,假设我想添加一个静态方法,returns class 的静态记录器实例。唯一的要求是静态函数应该按如下方式调用:
public class Foo {
private static final Logger LOG = LoggerFactor.getLogger(Foo.class);
public static void main(String[] args) {
Foo.getLogger().info("works!");
}
}
因为我认为这是一个横切关注点,所以我想在这里用 AspectJ 解决我的问题,但我没有找到关于我的场景的任何信息。
我的问题是:
- 这是否可能?
- 如果可以,请问如何实现?
我知道动态声明我的 classes 实现接口的父级的可能性,但后来我被卡住了,因为我无法在接口上生成静态方法:
public aspect StaticMethodAspect {
public interface HasStaticMethod {}
declare parents: ... implements HasStaticMethod;
public static Logger HasStaticMethod.getLogger() { //aspect error
...
}
}
我也知道this solution,但是不符合我对方法调用方式的要求
感谢您的回复
如果您想通过 ITD 声明静态方法或成员,您需要知道 class 名称,这对您来说并非如此。所以你坚持做与你已经发现的类似的事情,另请参阅我的答案:
这些例子也从另一个方面展示了如何直接进行日志记录,因为通常日志记录也是一个横切关注点。所以如果你能避免手动记录,就用我的方法吧。
但是如果您确实希望每个目标 class 都有一个 静态记录器 并且确实按照您的示例代码显示的方式使用它,请使用 AspectJ 与注释处理的集成 简要描述并链接到我在上面列表中的第一个答案。如果您不理解我提供的两个链接中的示例代码,请随时提出后续问题。
在我的项目中,我有一组 classes(我不知道其名称和编号),我想向其添加一个 public 静态方法。
为简单起见,假设我想添加一个静态方法,returns class 的静态记录器实例。唯一的要求是静态函数应该按如下方式调用:
public class Foo {
private static final Logger LOG = LoggerFactor.getLogger(Foo.class);
public static void main(String[] args) {
Foo.getLogger().info("works!");
}
}
因为我认为这是一个横切关注点,所以我想在这里用 AspectJ 解决我的问题,但我没有找到关于我的场景的任何信息。
我的问题是:
- 这是否可能?
- 如果可以,请问如何实现?
我知道动态声明我的 classes 实现接口的父级的可能性,但后来我被卡住了,因为我无法在接口上生成静态方法:
public aspect StaticMethodAspect {
public interface HasStaticMethod {}
declare parents: ... implements HasStaticMethod;
public static Logger HasStaticMethod.getLogger() { //aspect error
...
}
}
我也知道this solution,但是不符合我对方法调用方式的要求
感谢您的回复
如果您想通过 ITD 声明静态方法或成员,您需要知道 class 名称,这对您来说并非如此。所以你坚持做与你已经发现的类似的事情,另请参阅我的答案:
这些例子也从另一个方面展示了如何直接进行日志记录,因为通常日志记录也是一个横切关注点。所以如果你能避免手动记录,就用我的方法吧。
但是如果您确实希望每个目标 class 都有一个 静态记录器 并且确实按照您的示例代码显示的方式使用它,请使用 AspectJ 与注释处理的集成 简要描述并链接到我在上面列表中的第一个答案。如果您不理解我提供的两个链接中的示例代码,请随时提出后续问题。