在Java / Android中的任何位置获取类名称和方法名称

时间:2017-05-18 07:32:54

标签: java android

我是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,如果该类是本地或匿名类;否则为空。

1 个答案:

答案 0 :(得分:1)

如果你打算直接打电话,我解释一下:

  1. 你在A级,想要记录你在这里
  2. 您将直接从A类
  3. 调用此方法

    您可以使用:

     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()]