我是Android开发人员,非常喜欢日志记录。我一直在使用
形式的日志约定[产品类别:方法名()]
每当我需要记录某些内容时,这可以帮助我找到生成特定日志的确切位置,并在许多情况下提供帮助。
而不是每次都写
类名
和
方法名
手动我写了一个方法。他们可能是更好的做法。任何不使用循环的答案都是接受。
public static String getRef(Object object) {
StackTraceElement[] elements = Thread.currentThread().getStackTrace();
String method = "";
if (elements.length > 0) {
for (int i = 0; i < elements.length; i++) {
if (elements[i].getClassName().equals(object.getClass().getCanonicalName())) {
method = elements[i].getMethodName();
break;
}
}
}
return "[" + object.getClass().getSimpleName() + "::" + method + "()]";
}
通话:
Log.d(STRING_TAG,GlobalConfig.getRef(this)+“Server 响应:“+ JSON);
我已经尝试过使用
了Object.getClass()getEnclosingMethod();
但它总是返回null并且它应该返回它被称为正确的方法名称?正如文件所说
如果此Class对象表示a中的本地或匿名类 方法,返回一个表示立即封闭的Method对象 底层类的方法。否则返回null。特别是, 如果基础类是本地或,则此方法返回null 由类型声明实例直接包含的匿名类 初始化器或静态初始化器。
返回
方法底层的直接封闭方法 class,如果该类是本地或匿名类;否则为空。
答案 0 :(得分:1)
如果你打算直接打电话,我解释一下:
您可以使用:
StackTraceElement[] elements = Thread.currentThread().getStackTrace();
String method = "";
method = elements[elements.length - 2].getMethodName();
return "[" + object.getClass().getSimpleName() + "::" + method + "()]";
你得到的是最后一个叫做的课程。例如:
public class Random {
public static void main(String[] args) {
Random r = new Random();
r.test();
}
public void test() {
System.out.println(Logger.getRef(this));
}
}
class Logger {
public static String getRef(Object object) {
StackTraceElement[] elements = Thread.currentThread().getStackTrace();
String method = "";
method = elements[2].getMethodName();
return "[" + object.getClass().getSimpleName() + "::" + method + "()]";
}
}
Out:[Random :: test()]