【问题标题】:Java - insert println() in each method of given classJava - 在给定类的每个方法中插入 println()
【发布时间】:2017-12-28 12:48:21
【问题描述】:

我创建了一个 java 类,它将所有调用委托给另一个类。 我希望在每个方法调用程序上都会输出一些信息 - 方法名称和参数。 该类中有很多方法,所以我不想在每个方法中手动插入System.out.println()。 有没有办法用正则表达式做到这一点?

这是一个示例方法 with 需要 println() 行:

private final PreparedStatement statement;

@Override
public void setNull(int parameterIndex, int sqlType) throws SQLException {
    System.out.println("setNull: parameterIndex=" + ", sqlType" + sqlType);
    statement.setNull(parameterIndex, sqlType);
}

【问题讨论】:

  • 正则表达式?你知道如何使用正则表达式吗?这听起来更像loggin with AOP
  • @JuanCarlosMendoza 当他说正则表达式 xD 时,我笑得倒在地上
  • 世界上有什么正则表达式与此有关?但是,是的,您应该研究 AOP。投票以重复关闭,因为已经有很多了。
  • @CardinalSystem 很高兴让你这么开心。

标签: java regex delegates


【解决方案1】:

对于这种情况和类似情况,我们不会更新每个函数以添加 println,我们通常使用称为AOP(面向方面​​编程)的东西。

AOP 是一种有用的技术,可以在不显式更改源代码的情况下将可执行块添加到源代码中。在我们的示例中,我们不想在类中记录方法执行。相反,我们希望其他类拦截对方法 power() 的每次调用,测量其执行时间并将此信息发送到 slf4j。

请阅读本文了解更多详情aop-aspectj-java-method-logginglogging-with-aop-in-spring

AOP 让您能够拦截方法执行并在执行之前、之后或周围添加您的逻辑,因此在您的情况下,您可以在执行之前添加拦截器并打印您想要的消息。

AOP 示例:

@Aspect
public class MyLogger {

    private Logger log = Logger.getLogger(getClass());

    @before("execution(* *(..))") // after execution of any function 
    public void log(JoinPoint point) {
      System.out.println(point.getSignature().getName() + " called...");
    }
} 

你也可以使用point.getArgs()来获取所有的方法参数

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-17
    • 2015-10-27
    • 1970-01-01
    • 1970-01-01
    • 2015-11-26
    • 2011-12-21
    相关资源
    最近更新 更多