【问题标题】:How to log/trace any method call of object in java如何在java中记录/跟踪对象的任何方法调用
【发布时间】:2011-11-06 05:59:40
【问题描述】:

我需要一个 Python 装饰器之类的东西。我需要存储一些信息,特别是调用的方法、它的开始时间、结束时间和它的参数。我无法导入 Java 1.5 库之外的任何内容。有没有类似 Python 中可用的东西?

【问题讨论】:

  • 是的,我知道就像我说的,我不能在这个项目中导入除 java 默认库之外的任何东西。
  • 我假设您也不想修改需要分析的代码?
  • @MikeDaniels 准确,我不知道这个类的所有方法
  • 也许如果你告诉我们你的场景(即使它有点模糊)以及你试图完成这个问题的内容可能会更有成效。
  • @nsfyn55 我这次完成的是创建一个“调试”版本以投入生产并查看代码的真实行为,发生一些奇怪和随机的事情,我喜欢查看所有步骤(Ps.:性能现在不是问题,即使在生产中也是如此。)

标签: java methods call logging trace


【解决方案1】:

您可以尝试一些使用 Java 管理扩展或 java 代理的分析器。

http://java.sun.com/developer/technicalArticles/releases/j2se15/#mnm

【讨论】:

    【解决方案2】:

    【讨论】:

    • 是的,这可能是要走的路。不幸的是,看起来 waldecir 将无法手动修改字节码,因为他/她无法导入 ASM 或 Javassist 之类的库。哦,好吧。
    • 有什么例子可以说明我如何将 pre/pos 函数添加到所有具有检测功能的函数中?
    • 这就是该教程的目的,“本文将展示如何实现这样一个 Java 代理,它会透明地使用标准 Java Logging API 向所有类中的所有方法添加入口和出口日志记录。 "这是链接:today.java.net/pub/a/today/2008/04/24/…
    • @cschooley,该教程使用 Javassist。
    • @Mike Daniels:我们不知道“不导入任何东西”的要求是编译时还是运行时。人们可以很容易地使用 Javassist 以一种没有依赖关系的方式对编译后的代码进行后处理。所以使用 Javassist 的提议似乎相当不错。
    【解决方案3】:

    不,Python 装饰器不允许您在不更改任何内容的情况下监控所有代码。您仍然必须将您的装饰器放在任何地方(并且 - 本质上 - 将您的每个函数包装到一个进行计数的函数中)。

    我不确定我是否理解您的要求(您没有说是否需要用于生产或测试的代码;此外,“不导入任何东西”的要求很奇怪:您的所有类都在默认包中吗?你允许使用 IDE 和编译器?),但我认为最简单的方法是使用 Javassist(cschooley 提供的第二个链接是一个完美的介绍),但不要使用代理:而是使用 CtClass#write( ) 来检测类文件并将它们保存到磁盘(可能在自定义 ant 任务中)。这样,最终构建将不需要任何特殊设置。

    【讨论】:

    • 是的,不要这样做,我需要一种方法来在类的所有方法中添加装饰器行为以提取一些信息。
    • @waldecir:你已经得到了答案,为什么不使用它们?
    【解决方案4】:

    Java 的良好跟踪工具是BTrace

    【讨论】:

      【解决方案5】:

      如果您只能依赖接口方法,您可能会使用 Java Proxy 类。

      【讨论】:

        【解决方案6】:

        @Loggable 注释和来自jcabi-aspects 的 AspectJ 方面可能会对您有所帮助。注释所有方法,每次调用它们时 SLF4J 都会收到日志消息:

        @Loggable(Loggable.DEBUG)
        public String load(URL url) {
          return url.openConnection().getContent();
        }
        

        jcabi-aspects 的下一个版本中,将实现类的完整日志记录:https://github.com/yegor256/jcabi/issues/129

        【讨论】:

          猜你喜欢
          • 2015-06-05
          • 1970-01-01
          • 2018-04-22
          • 1970-01-01
          • 2018-05-12
          • 2015-10-03
          • 1970-01-01
          • 2021-08-07
          相关资源
          最近更新 更多