2015-04-08 5 views
4

У меня есть два метода. В одном из них я называю второй. В этом втором мне нужно знать имя метода, который вызывает этот (второй).Получить имя метода вызывающего объекта моего метода

Возможно ли это?

public class Test { 
    public void foo() { 
    String m = getCallingMethodName(); 
    } 
    public String getCallingMethodName() { 
    return callerMethodName; //should return "foo" 
    } 
} 
+2

В то время как вы * можете сделать это с кодом, такие как manouti предоставил, я не был бы совершенно удивлен увидеть, если не из-за таких вещей, как встраивание - было бы лучше, чтобы избежать необходимости * * это если все возможно. Чего вы пытаетесь достичь? –

+0

Да. Вы можете получить трассировку стека текущего потока и посмотреть следующий снизу вверх. (Я могу предоставить более подробную информацию, когда я доберусь до реального компьютера, вместо того, чтобы отвечать на мой телефон, или кто-то другой может смело превратить это в ответ). Я бы рекомендовал изменить ваш код, чтобы он не нуждался в этом, поскольку он делает ваш код хрупким. Почему вызывающий абонент просто не передает эту информацию в качестве аргумента? – Krease

+0

Okey, я работаю над модулем Android (Xposed). Мне нужно знать, кто звонит в Android API X. К кому я имею в виду приложение (пакет) и точный метод/класс. Жаль, что мне не пришлось делать этот большой взлом, но пока не знаю, как его упростить. – user2126425

ответ

0

Вы можете использовать следующее:

StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace(); 
StackTraceElement stackTraceElement = stackTraceElements[1]; 
String methodName = stackTraceElement.getMethodName(); 

Однако это не гарантированно возвращает точный результат, согласно Javadocs из Thread#getStackTrace():

Некоторые виртуальные машины могут при некоторые обстоятельства, опустить один или несколько кадров стека из трассировки стека. В крайнем случае виртуальной машине, которая не имеет информации о трассировке стека, относящейся к этому потоку, разрешено возвращать массив нулевой длины из этого метода.

Возможно, вы должны подумать о разработке своей программы, если хотите получить точные результаты во всех реализациях JVM.

1

При этом вы можете получить текущее имя метода:

String method_name = Thread.currentThread().getStackTrace()[1].getMethodName()); 
1

Другие ответы здесь правильные, но я думал, что я хотел бы добавить небольшое предостережение. Это не будет работать, если вы звоните вещи, используя отражение, а также он не может получить правильный кадр стека, если у вас есть какие-либо АОП joinpoints/прокси и т.д.

Например ...

import java.lang.reflect.Method; 

public class CallerInfoFinder { 

    public static void main(String[] args) throws Exception { 
     otherMethod(); // Prints "main" 

     Method m = CallerInfoFinder.class.getDeclaredMethod("otherMethod"); 

     m.invoke(null); // Prints "invoke0" 
    } 

    private static void otherMethod() { 
     System.out.println(new Exception().getStackTrace()[1].getMethodName()); 
    } 
} 
0

Вы можете использовать метод getStackTrace() в текущем потоке. Это возвращает стек вызовов в обратном порядке

StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace(); 
     for (int i = 1; i < stackTraceElements.length && i<=4; i++) { 
      StackTraceElement stackTraceElement = stackTraceElements[i]; 
      System.out.println(stackTraceElement.getClassName() + " Method " 
      + stackTraceElement.getMethodName()); 

     } 
0

Этот метод показывает 3 последних точки Метод вызова иерархии в порядке их вызова, игнорируя 2 самых последние методы, которые включают в себя сам следующий метод. Это очень полезно, чтобы поймать иерархию методов в программном модуле, где несколько путей доступа к одному и тому же местоположению.

private static String getRecentSteps() { 
    String recentSteps = ""; 
    StackTraceElement[] traceElements = Thread.currentThread().getStackTrace(); 
    final int maxStepCount = 3; 
    final int skipCount = 2; 

    for (int i = Math.min(maxStepCount + skipCount, traceElements.length) - 1; i >= skipCount; i--) { 
     String className = traceElements[i].getClassName().substring(traceElements[i].getClassName().lastIndexOf(".") + 1); 
     recentSteps += " >> " + className + "." + traceElements[i].getMethodName() + "()"; 
    } 

    return recentSteps; 
}