代码之家  ›  专栏  ›  技术社区  ›  Koldar

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

  •  0
  • Koldar  · 技术社区  · 6 年前

    在我的项目中,我有一组类(其名称和编号不是先验的),我想将一个公共静态方法添加到其中。

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

    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 回复  |  直到 6 年前
        1
  •  1
  •   kriegaex    6 年前

    如果您想通过ITD声明静态方法或成员,您需要知道类名,这对您来说不是这样。所以你一直在做类似于你已经发现的事情,也请看我这里的答案:

    这些示例还展示了如何直接从另一个方面进行日志记录,因为日志记录通常也是一个交叉关注点。所以,如果您可以避免手动登录,就使用我的方法。

    但如果你真的想 静态记录器 对于每个目标类,并按照示例代码显示的方式使用它,请使用 AspectJ与注释处理的集成 简单描述并链接到上面列表中我的第一个答案。如果您不理解我在这里提供的两个链接中的示例代码,请随时提出后续问题。