gpt4 book ai didi

java - 在主执行 block 之前和之后将代码注入(inject)到方法中

转载 作者:行者123 更新时间:2023-11-30 05:25:41 24 4
gpt4 key购买 nike

我有几个类实现了特定的接口(interface),如下所示(这显然是一个非常简化的版本,但明白了要点):

public interface Talk {
void sayIt();
}

Talk 的首次实现:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class SayHello implements Talk {

static final Logger LOG = LoggerFactory.getLogger(SayHello.class);

public SayHello() {}

public void sayIt() {
System.out.println("Hello");
}
}

Talk 的第二次实现:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class SayGoodbye implements Talk {

static final Logger LOG = LoggerFactory.getLogger(SayHello.class);

public SayGoodbye() {}

public void sayIt() {
System.out.println("GoodBye");
}

}

现在在 sayIt() 方法中,我想实现一些跟踪级别日志记录和一些方法执行计时器,我可以简单地执行以下操作:

public void sayIt() {
long startTime = System.currentTimeMillis();
LOG.trace("Executing sayIT for implementation {} , start time at {}.", this.getClass().getSimpleName(), startTime);
System.out.println("Hello");
LOG.trace("sayIT for implementation {} took {} milliseconds to execute.", this.getClass().getSimpleName(), System.currentTimeMillis() - startTime);
}

问题是我需要将其复制粘贴到实现 Talk< 的每个 classsayIt() 方法的每个实现中 界面,我真的不想这样做,因为......

  1. 它会造成大量重复。
  2. 随着实现的增多,您会开始遇到维护问题,尤其是当您决定稍微更改实现时。
  3. 我很懒,喜欢编写尽可能少的代码,同时尽可能多地重用。

那么问题来了...我如何实现一次编写多次使用的目标?方法计时是一种应用程序,但我真的只是希望能够在方法的开头和结尾“注入(inject)”代码。

我真的在寻找一个可能有效的工作示例(不仅仅是指向更多链接的链接)(我猜像 AspectJ ,但我一直在寻找试图让它与 Gradle 一起工作有无尽的麻烦......可能只是尝试了 Maven 实现)

哦,是的,我可以不将代码添加到 sayIt() 中,而是将其添加到调用 sayIt() 的代码中,例如:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.ArrayList;
import java.util.List;

public class SomeOtherClass {

static final Logger LOG = LoggerFactory.getLogger(SomeOtherClass.class);

public SomeOtherClass() {}

public void letsHaveAConversation() {
List<Talk> talks = new ArrayList<>();
talks.add(new SayHello());
talks.add(new SayGoodbye());
for (Talk talking : talks) {
long startTime = System.currentTimeMillis();
LOG.trace("Executing sayIT for implementation {} , start time at {}.", talking.getClass().getSimpleName(), startTime);
talking.sayIt();
LOG.trace("sayIT for implementation {} took {} milliseconds to execute.", talking.getClass().getSimpleName(), System.currentTimeMillis() - startTime);
}
}

}

这会起作用,但如果我有多个调用 sayIt() 的位置,则不起作用。

最佳答案

为什么不直接将 sayIt 调用包装在抽象类公共(public)方法中?

abstract class AbstractTalk implements Talk {
public void sayIt() {
trace();
startMeasure();

doSayIt();

stopMeasure();
}

abstract protected doSayIt(); // here implement the logic
}

关于java - 在主执行 block 之前和之后将代码注入(inject)到方法中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58674324/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com