Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 向类添加类型间公共静态方法_Java_Static_Aop_Aspectj_Aspect - Fatal编程技术网

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

Java 向类添加类型间公共静态方法,java,static,aop,aspectj,aspect,Java,Static,Aop,Aspectj,Aspect,在我的项目中,我有一组类(我不知道它们的名称和编号),我想在其中添加一个公共静态方法 为了简单起见,假设我想添加一个静态方法,该方法返回类的静态记录器实例。唯一的要求是静态函数应按如下方式调用: public class Foo { private static final Logger LOG = LoggerFactor.getLogger(Foo.class); public static void main(String[] args) { Foo.ge

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

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

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
        ...
    }

}
我也知道,但它不符合我对调用方法的方式的要求


感谢您的回复

如果您想通过ITD声明静态方法或成员,您需要知道类名,但实际情况并非如此。因此,你必须做与你已经发现的类似的事情,请参见我的答案:

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


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

Hello@kriegaex,我希望您能回答我!结合aspect文档,我在学习aspectj时阅读了您的几个答案(包括您提供的第二个和第三个链接)。话虽如此,我对第一个链接很感兴趣,特别是注释处理:基本上它允许动态生成给定特定注释的方面?在
ajc
中,除了作为处理器之外,似乎还需要一个注释。我的直觉正确吗?是的,如果我正确理解你的问题。您可以使用一个(可能是自定义的)注释来注释目标类,类似于
@Log
。然后,每当在构建的注释处理阶段发现注释类时,就会触发处理器。处理器通过ITD创建相应的方面源代码文件,每个目标类一个。然后编译正常进行,所有类和方面(包括APT生成的类和方面)都会被编译和编织。你可以手动或通过AspectJ Maven插件来实现这一点。我不太喜欢这种方法的唯一一点是,你实际上必须用注释“污染”你自己的应用程序类,而注释的唯一目的就是让AOP相关的注释处理器来处理。我喜欢尽可能地将自己的方面排除在应用程序源代码之外。但目前ITD不能像普通切入点那样使用类型名模式,这是AspectJ的一个限制。我刚开始和邮件列表上的AspectJ维护负责人讨论这个问题,让我们看看他说了些什么。很高兴听到这个问题带来了一些好处。同时,我将接受你的答复。我认为目前我的问题确实可以通过注释处理来解决。