構文
StackTraceElement[] stackTraces = Thread.currentThread().getStackTrace();
サンプル
package com; public class Sample { public static void main(String[] args) { StackTraceElement[] stackTraces = Thread.currentThread().getStackTrace(); for (StackTraceElement stackTraceElement : stackTraces) { String className = stackTraceElement.getClassName(); String methodName = stackTraceElement.getMethodName(); int lineNumber = stackTraceElement.getLineNumber(); String content = String.format("%s %s() [%d]", className, methodName, lineNumber); System.out.println("---------"); System.out.println(content); System.out.println("---------"); } } }
出力
--------- java.lang.Thread getStackTrace() [-1] --------- --------- com.Sample main() [5] ---------
ログに応用する
サンプル1
* 対象のStackTraceElementが固定(今回の場合「Index = 3」)でわかっている場合Logger.java
package com.log; public class Logger { private static int Index = 3; public static void WriteLog(String content) { StackTraceElement stackTraceElement = Logger.getStackTraceElement(Logger.Index); String className = stackTraceElement.getClassName(); String methodName = stackTraceElement.getMethodName(); int lineNumber = stackTraceElement.getLineNumber(); String logContent = String.format("%s.%s() [%d] : %s", className, methodName, lineNumber, content); System.out.println(logContent); } private static StackTraceElement getStackTraceElement(int index) { StackTraceElement[] stackTraces = Thread.currentThread().getStackTrace(); return stackTraces[index]; } }
Sample.java
package com; import com.log.Logger; public class Sample { public static void main(String[] args) { Logger.WriteLog("1st"); Sample.methodA(); } private static void methodA() { Logger.WriteLog("2nd"); Sample.methodB(); } private static void methodB() { Logger.WriteLog("3rd"); } }
出力
com.Sample.main() [7] : 1st com.Sample.methodA() [12] : 2nd com.Sample.methodB() [17] : 3rd
サンプル2
* 汎用的に使える方法* 「Sample.java」はサンプル1を使う
Util.java
* Class.forName(【Class名】) は、文字列からインスタンスを生成public class Util { public static StackTraceElement getStackTraceElement( Class<?> ignoredClass) { StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace(); boolean isFoundUtilClass = false; Class<?> targetClass; for (StackTraceElement stackTraceElement : stackTraceElements) { try { targetClass = Class.forName(stackTraceElement.getClassName()); } catch (ClassNotFoundException e) { e.printStackTrace(); continue; } if (targetClass.equals(Util.class)) { isFoundUtilClass = true; continue; } if (!isFoundUtilClass || Util.isImplemented(ignoredClass, targetClass)) { continue; } return stackTraceElement; } return null; } public static boolean isImplemented( Class<?> interfaceClass, Class<?> targetClass) { if (interfaceClass.equals(targetClass) || interfaceClass.isInterface() && interfaceClass.isAssignableFrom(targetClass)) { return true; } return false; } }
ILogger.java
package com.log; public interface ILogger { }
Logger.java
package com.log; public class Logger implements ILogger { public static void WriteLog(String content) { StackTraceElement stackTraceElement = Util.getStackTraceElement(ILogger.class); String className = stackTraceElement.getClassName(); String methodName = stackTraceElement.getMethodName(); int lineNumber = stackTraceElement.getLineNumber(); String logContent = String.format("%s.%s() [%d] : %s", className, methodName, lineNumber, content); System.out.println(logContent); } }