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; }