[java]例外を使ってメソッドがよばれた位置を表示
2009/02/03
java
メソッドがどういうふうに呼ばれたか知りたい場合に、例外を発生させてスタックトレースを調べるという方法、かなり昔からあるテクニック。
デバッガ使えばいいんだろうけど。
package debug;
public abstract class DebugUtils {
public static final String trace() {
String trace = "";
try {
alwaysOcurringException();
} catch (Exception e) {
StackTraceElement[] stackTraceElements = e.getStackTrace();
StringBuilder buffer = new StringBuilder();
StringBuilder padding = new StringBuilder();
final String PAD = " ";
for (StackTraceElement stackTraceElement : stackTraceElements) {
if (!eq(stackTraceElement.getMethodName(),
"alwaysOcurringException")
&& !eq(stackTraceElement.getMethodName(), "trace")) {
buffer.append(padding).append(stackTraceElement).append(
"\n");
padding.append(PAD);
}
}
trace = new String(buffer);
}
return trace;
}
static protected final void alwaysOcurringException() throws Exception {
throw new FakeException();
}
static class FakeException extends Exception {
private static final long serialVersionUID = 1L;
}
protected static boolean eq(Object object, Object object2) {
return object == null ? object2 == null : object.equals(object2);
}
}
public abstract class DebugUtils {
public static final String trace() {
String trace = "";
try {
alwaysOcurringException();
} catch (Exception e) {
StackTraceElement[] stackTraceElements = e.getStackTrace();
StringBuilder buffer = new StringBuilder();
StringBuilder padding = new StringBuilder();
final String PAD = " ";
for (StackTraceElement stackTraceElement : stackTraceElements) {
if (!eq(stackTraceElement.getMethodName(),
"alwaysOcurringException")
&& !eq(stackTraceElement.getMethodName(), "trace")) {
buffer.append(padding).append(stackTraceElement).append(
"\n");
padding.append(PAD);
}
}
trace = new String(buffer);
}
return trace;
}
static protected final void alwaysOcurringException() throws Exception {
throw new FakeException();
}
static class FakeException extends Exception {
private static final long serialVersionUID = 1L;
}
protected static boolean eq(Object object, Object object2) {
return object == null ? object2 == null : object.equals(object2);
}
}
僕の場合、デバッガ使うとどうしても頭のドライブ感とマッチしないときがあって、ついつい標準出力させてちゃうんだよね。
人それぞれということで。
: