查找toString()方法的所有用法

问题描述 投票:10回答:3

我有一个庞大的项目,在这个项目的各个地方都广泛使用。该类定义了输出大量信息的toString()方法。我想定义另一个方法,例如,toShortString()并替换所有使用此方法调用调用原始toString()的实例。

问题是有很多代码如下所示:

log.debug("Order issued: " + order);
log.debug("Loaded list of orders: " + orders);

其中order是此对象的实例,orders是此类对象的列表。

有没有办法找到所有这些事件?

欢迎任何建议。 IDE是IntelliJ Idea,如果重要的话。

java intellij-idea
3个回答
3
投票

只需覆盖toString()类中的Order方法体。

从技术上讲,找不到所有调用是不可能的,因为即使是系统库也会在很多地方调用toString(),就像所有类型的集合一样。此外,您应该注意您的模板(无论您使用什么GUI。)

因此,您要记录短打印输出,并调试完整(原始)。两人都在打电话给toString()。然后,您可以尝试查看调用堆栈跟踪内部以确定它的调用位置。使用Thread.currentThread().getStackTrace()访问当前堆栈跟踪。

比如说,如果最后10个stacktrace元素中的任何一个来自你的Log类,则调用它进行日志记录,然后你可以打印短打印输出。否则执行完整的打印输出。

是的,将不同版本的toString()移动到单独的方法中是一种好习惯。


4
投票

而不是替换所有出现错误的toString()(你肯定会错过一些)和一些真的很难替换(例如,System.out.println() List对象的Order总是只调用toString())我建议你修改toString()本身叫toShortString()

toString()中的所有代码移动到另一个名为toLongString()的函数中,然后使用此函数,您需要具有String对象的详细Order表示。


0
投票

我知道我有点迟了,但我发现在IDEA中这样做是合法的:

  1. 在你的班级里面标记toString方法作为@Deprecated
  2. Analyze - > Run inspection by name - >选择Deprecated API usage

中提琴!它将列出任何已弃用的API的所有用法(希望你不要这样做)当然包括你刚刚注释的toString。不要忘记删除注释。

附:不会显示隐式调用

© www.soinside.com 2019 - 2024. All rights reserved.