14

I have a huge project with a class that is widely used everywhere inside this project. This class defines toString() method which outputs a lot of information. I want to define another method, say, toShortString() and replace all of the occurrences where original toString() is called with this method call.

The problem is that there is a lot of code that looks like follows:

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

where order is instance of this object and orders is a list of such objects.

Is there any way to find all such occurrences?

Any suggestions are welcome. IDE is IntelliJ Idea, if it matters.

4

4 回答 4

4

而不是替换所有toString()容易出错的事件(你肯定会错过一些)和一些非常难以替换的事件(例如,对象System.out.println()总是只调用)我建议你修改它本身来调用.ListOrdertoString()toString()toShortString()

将里面的所有代码toString()移到另一个调用的函数toLongString()中,然后在您觉得需要详细String表示Order对象的地方使用这个函数。

于 2013-06-05T14:41:51.270 回答
3

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

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

因此,您想要记录简短的打印输出,并调试完整的(原始)。两人都在打电话toString()。然后你可以尝试查看调用堆栈跟踪以确定它是从哪里调用的。用于Thread.currentThread().getStackTrace()访问当前堆栈跟踪。

比如说,如果最后 10 个堆栈跟踪元素中的任何一个来自您的Log类,则调用它进行日志记录,那么您可以打印简短的打印输出。否则进行完整的打印输出。

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

于 2013-06-05T14:35:38.607 回答
3

这是一种在 IDEA 中查找所有显式(不会找到您展示的 2 个示例)toString()调用的方法:

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

它将列出任何已弃用的 API 的所有用法,其中当然包括toString您刚刚注释的 API。不要忘记删除注释。

于 2018-01-18T10:15:43.993 回答
1

2021 年 Intellij 可以找到“隐式调用”。它是“查找使用设置”操作的一个选项(可以通过按双档找到)。

这将帮助您找到以下事件:

log.debug("Order issued: " + order);

但不幸的是找不到集合到字符串的转换:

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

查找使用设置

于 2021-08-17T09:20:02.503 回答