Java:如何获取调用者函数名称
为了修复测试用例,我需要确定是否从特定的调用函数调用该函数。 我无法承受添加布尔参数,因为它会破坏定义的接口。 怎么去呢?
这就是我想要实现的目标。 这里我不能改变operation()的参数,因为它是一个接口实现。
operation() { if not called from performancetest() method do expensive bookkeeping operation ... }
你可以试试
StackTraceElement[] stacktrace = Thread.currentThread().getStackTrace(); StackTraceElement e = stacktrace[2];//maybe this number needs to be corrected String methodName = e.getMethodName();
您可以使用Stacktrace找到调用方法
这是我写的一个函数,用于记录调用它的函数的函数名。 它会运行堆栈跟踪,直到找到名为logIt的函数,然后显示下一个名称。 这是一个肮脏的黑客,所以除非你用它来调试,否则不要这样做。
private static void logIt() { StackTraceElement[] stacktrace = Thread.currentThread().getStackTrace(); boolean logged = false; boolean foundMe = false; for(int i=0; i
Android用法的另一个示例:
//package your.package.name; import android.util.Log; /* File name: MyDebugLog.java */ public class MyDebugLog { private static final int index = 4; // <== Index in call stack array private static final String methodName = "Log"; // <== Name of method for public call private static String getCallerName() { String caller = "NONE"; final StackTraceElement[] stacktrace = Thread.currentThread().getStackTrace(); for (int i = 0; i < stacktrace.length; i++) { Log.e("Method ", "[" + i + "]" + stacktrace[i].getMethodName()); } if (stacktrace.length >= index){ caller = stacktrace[index].getMethodName(); } return caller; } private static String getTag() { String tag = "NONE"; final StackTraceElement[] stacktrace = Thread.currentThread().getStackTrace(); for (int i = 0; i < stacktrace.length; i++) { Log.e("Method ", "[" + i + "]" + stacktrace[i].getMethodName()); if (stacktrace[i].getMethodName().equals(methodName)) { tag = "("+stacktrace[i + 1].getFileName() + ":" + stacktrace[i + 1].getLineNumber()+")"; return tag; } } return tag; } public static void Log(String message){ Log.v(getTag(), getCallerName() + " " + message); } }
用法:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.sample_main); MyDebugLog.Log("XXXXX"); }
输出:
V/(MainActivity.java:117): onCreate XXXXX
数组样本:
getTag Sample of stacktace array: Method: [0]getThreadStackTrace Method: [1]getStackTrace Method: [2]getTag Method: [3]Log <== Method for external call ... getName Sample of stacktace array: Method: [0]getThreadStackTrace Method: [1]getStackTrace Method: [2]getCallerName Method: [3]Log Method: [4]onCreate <== Our external method Method: [5]performCreate ...
我调整了这里讨论的代码并对其进行了自定义以获取调用方法。 这里的代码是迭代堆栈跟踪元素,一旦找到被调用方法的名称,它就会获得前一个方法的名称,而后者又是调用此方法的方法。
private String method() { String methodName=null; StackTraceElement[] stacktrace = Thread.currentThread().getStackTrace(); for (int i = 0; i < stacktrace.length; i++) { if(stacktrace[i].getMethodName().equals("method")) { methodName = stacktrace[i+1].getMethodName(); break; } } return methodName; }