我正在尝试创建一个从该方法中返回方法名称的函数:
public static String getMethodName(final int depth)
{
final StackTraceElement[] ste = Thread.currentThread().getStackTrace();
return ste[ste.length - 1 - depth].getMethodName();
}
但是,当我从Activity.onCreate()调用此方法时,它返回“main”而不是“onCreate”。
如何从该方法中获取实际方法名称?
答案 0 :(得分:8)
return ste[1+depth].getMethodName();
如果你改变上面的return语句,你会得到立即调用方法名称,cource depth应该为零..
答案 1 :(得分:3)
尽管启动异常是一种更昂贵的方式,但无论如何我都会这样做。
Log.d("CurrentMethod", new Exception().getStackTrace()[0].getMethodName());
如果在onCreate中调用,则工作。
答案 2 :(得分:2)
管理日志的单身人士:
public class ActiveLog {
public static final String TAG = "TRACE LOG";
private static ActiveLog instance;
private static boolean actif;
public static ActiveLog getInstance() {
if (null == instance)
instance = new ActiveLog();
return instance;
}
private ActiveLog() {
ActiveLog.setActif(true);
}
public void log() {
if(isActif())
Log.d(TAG, "" + (new Exception().getStackTrace()[1].getClassName())
+ ": "
+ (new Exception().getStackTrace()[1].getMethodName()));
}
public static boolean isActif() {
return actif;
}
public static void setActif(boolean actif) {
ActiveLog.actif = actif;
}}
使用示例:
public class MyTest {
public void test() {
ActiveLog.getInstance().log();
}
}
结果:
09-05 14:37:09.822: D/TRACE LOG(XXXX): com.TestProject.MyTest: test
答案 3 :(得分:1)
我认为您的问题可能是您正在颠倒访问堆栈。在返回的值元素中,0是最近的调用(可能是getStackTrace())。我想你打算做的是:
public static String getMethodName(final int depth) {
final StackTraceElement[] ste = Thread.currentThread().getStackTrace();
return ste[1 + depth].getMethodName();
}
这将访问堆栈中的最新调用(在调用getStackTrace()之外)。例如,如果您有方法:
public void foo() {
System.out.println(getMethodName(0));
}
这将使用上面的函数实现打印“foo”。当然,您可能还需要为函数添加一些边界检查,因为它可以轻松地在数组之外。