Есть ли способ автоматически регистрировать имя метода в Android?

Я использую такой шаблон:

public class FooProvider extends ContentProvider { private static final String TAG = FooProvider.class.getSimpleName(); ... @Override public int update(Uri uri, ContentValues values, String where, String[] whereArgs) { lv(TAG, TAG + ".update() Uri:" + uri.toString() + " " + db.getPath()); 

Где l – моя обертка вокруг Androids Log.v, которая принимает String … args. Это дает вывод logcat следующим образом:

 FooProvider.update() Uri: foo bar etc 

Я ищу способ зарегистрировать имя метода, в этом случае update (), автоматически и таким образом, чтобы выжить при реорганизации метода TAG. Я видел вызов class.getMethods (), но не вижу способа индексировать возвращенный список с текущим методом во время выполнения.

Возможно, вы захотите обернуть эти операторы в константу, поэтому они будут скомпилированы для вашей опубликованной версии (которая в любом случае не будет печатать инструкции Log.v), но вы можете сделать что-то вроде этого:

 private static final boolean FINAL_CONSTANT_IS_LOCAL = true; private static final String TAG = FooProvider.class.getSimpleName(); private String getLogTagWithMethod() { if (FINAL_CONSTANT_IS_LOCAL) { Throwable stack = new Throwable().fillInStackTrace(); StackTraceElement[] trace = stack.getStackTrace(); return trace[0].getClassName() + "." + trace[0].getMethodName() + ":" + trace[0].getLineNumber(); } else { return TAG; } } 

Это будет зависеть от того, как вы это называете, чтобы определить, какой индекс StackTraceElement вам нужен, просто отлаживайте его или играйте несколько раз, чтобы найти его.

Когда вы компилируете опубликованную версию, просто установите FINAL_CONSTANT_IS_LOCAL в false, и этот блок кода исчезнет, ​​всегда возвращая TAG.

Это кажется дорогим, но вы можете использовать

 String Method = Thread.currentThread().getStackTrace()[2].getMethodName(); 

Причина, по которой вы используете индекс 2, заключается в том, что 0 = возвращает currentThread и 1 = getStackTrace. Это работает на Java 1.5 и выше, я бы обернул его каким-то образом, если (DEBUG) {}, так что это не в производственном коде

Конечно, вам нужно будет отрегулировать глубину, если вы поместите ее внутри метода и т. Д.

У меня есть собственный журнал, который обертывает журнал Android.

Он отобразит имя класса, имя метода и номер строки.

http://www.hautelooktech.com/2011/08/15/android-logging/

Вы можете сделать статические методы, подобные этим, и называть их с начала и конца методов, которые вы хотите отлаживать:

  public static void entry_log(String id) { Throwable stack = new Throwable().fillInStackTrace(); StackTraceElement[] trace = stack.getStackTrace(); Log.v("ENTRY", id + " - " + trace[1].getClassName() + "." + trace[1].getMethodName() + ":" + trace[1].getLineNumber()); break; } 

А также

 public void exit_log(String id) { Throwable stack = new Throwable().fillInStackTrace(); StackTraceElement[] trace = stack.getStackTrace(); Log.v("EXIT", id + " - " + trace[1].getClassName() + "." + trace[1].getMethodName() + ":" + trace[1].getLineNumber()); break; } 

Я создал эту утилиту Logging для Android с еще несколькими функциями, кроме журналов входа-выхода. Вы можете найти это полезным.