2011-04-05 16 views
6

मैं एक ऐसा फ़ंक्शन बनाने की कोशिश कर रहा हूं जो उस विधि के भीतर से विधि का नाम देता है:मैं उस विधि के भीतर से विधि का नाम कैसे प्राप्त करूं?

 public static String getMethodName(final int depth) 
    { 
    final StackTraceElement[] ste = Thread.currentThread().getStackTrace(); 
    return ste[ste.length - 1 - depth].getMethodName(); 
    } 

हालांकि, जब मैं इस विधि को Activity.onCreate() से कॉल करता हूं, तो यह "ऑनक्रेट" के बजाय "मुख्य" देता है।

मैं उस विधि के भीतर से वास्तविक विधि नाम कैसे प्राप्त करूं?

उत्तर

8
return ste[1+depth].getMethodName(); 

यदि आपने उपरोक्त वापसी कथन बदलते हैं तो आप .. तत्काल बुला विधि नाम मिलेगा शून्य हो shoould cource गहराई का,

+0

मैं आपके सुझाए गए परिवर्तन करने की कोशिश की और अब यह रिटर्न "getStackTrace" । मैं इसे निश्चित रूप से getMethodName (0) के साथ बुला रहा हूं। –

+4

@Android Eve, ste [0] -> getStackTrace, ste [1] -> getMethodName, ste [2] -> getMethodName के तत्काल कॉलर ... –

+0

getMethodName (2) चाल चल रही है। धन्यवाद! (और +7)। –

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" प्रिंट करेगा। बेशक आप फ़ंक्शन में कुछ सीमाएं भी जोड़ना चाह सकते हैं क्योंकि यह आसानी से सरणी के बाहर जा सकता है।

+0

मैंने आपके सुझाए गए परिवर्तन की कोशिश की और अब यह "getStackTrace" लौटाता है। मैं इसे निश्चित रूप से getMethodName (0) के साथ बुला रहा हूं। –

3

एक अपवाद शुरू करने के तथ्य के बावजूद एक महंगा तरीका है, मैं वैसे भी करूँगा।

Log.d("CurrentMethod", new Exception().getStackTrace()[0].getMethodName()); 

यदि क्रेट में बुलाया जाता है तो काम करता है।

+1

मुझे समझ में नहीं आता - 'Thread.currentThread()। GetStackTrace() 'को कॉल करने के बजाय अपवाद क्यों बनाएं? –

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 
संबंधित मुद्दे

 संबंधित मुद्दे