2013-06-05 58 views
10

我有一个在项目中广泛使用的类的大型项目。这个类定义了输出大量信息的方法toString()。我想定义另一种方法,例如toShortString(),并用此方法调用替换原始toString()所调用的所有事件。查找toString()方法的所有用法

的问题是,有大量的代码看起来像如下:

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

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

有什么方法可以找到所有这些事件吗?

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

+1

您是否想用'toShortString()'调用某些对象来完全替换'toString()'调用?你自己的东西是?你不能简单地重写'toString()'?是否有可能回到当前的'toString()'实现? – Gamb

+0

intellij backlog上的这个开放问题似乎描述了您要查找的内容:http://youtrack.jetbrains.com/issue/IDEABKL-3992 –

+1

您将无法简单地用'订单替换'orders'。 toShortString'。 –

回答

3

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

从技术上讲,无法找到所有的调用,因为甚至系统库在很多地方调用toString(),就像所有种类的集合一样。你也应该注意自己的模板(GUI无论你正在使用。)

所以,你要日志短的打印输出,并且调试全(原件)。两者都致电toString()。然后,您可以尝试查看调用堆栈跟踪的内部以决定它从哪里调用。使用Thread.currentThread().getStackTrace()访问当前堆栈跟踪。

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

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

+0

在这种情况下,我将在调试器中丢失关于此对象状态的信息,这不是我想要发生的事情。 –

+0

我认为*状态*不会丢失,只有您得到不同的打印输出。我并不熟悉Idea,但在Eclipse中,您可以为某个类定义可视化,也可能在Idea中有类似的方法。 – gaborsch

+0

谢谢你的回答,我会坚持改变'toString()'方法。 –

4

而不是更换所有出现次数的toString()这将是容易出错(你肯定会错过一些)和一些非常难以替代的(例如,在OrderList一个对象System.out.println()总是调用toString()只),我建议您自行修改toString()以致电toShortString()

将所有内部toString()代码名为toLongString()然后,你觉得需要有Order对象的详细String表示使用该功能的其他功能。

+0

谢谢你的回答,我会坚持改变'toString()'方法。 –

0

我知道我有点晚了,但我发现这样做在IDEA的一个合法的方式:

  1. 内,您的类别标志toString方法@Deprecated
  2. AnalyzeRun inspection by name→select Deprecated API usage

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

P.S.将不会显示隐式调用