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

在Java/Android中的任意位置获取类名和方法名,java,android,Java,Android,我是android开发者,非常喜欢日志记录。我对我的日志使用了一种约定,即 [ClassName:methodName()] 每当我必须记录一些东西时,这可以帮助我找到生成特定日志的确切位置,在许多情况下都很有用 而不是每次都写 类名 及 方法名 我手动编写了一个方法。他们可能是做这件事的更好方法。任何不使用循环的答案都被接受 public static String getRef(Object object) { StackTraceElement[] elements = T

我是android开发者,非常喜欢日志记录。我对我的日志使用了一种约定,即

[ClassName:methodName()]

每当我必须记录一些东西时,这可以帮助我找到生成特定日志的确切位置,在许多情况下都很有用

而不是每次都写

类名

方法名

我手动编写了一个方法。他们可能是做这件事的更好方法。任何不使用循环的答案都被接受

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 + "()]";
    }
公共静态字符串getRef(对象){
StackTraceElement[]元素=Thread.currentThread().getStackTrace();
字符串方法=”;
如果(elements.length>0){
for(int i=0;i
电话:

Log.d(STRING_标记,GlobalConfig.getRef(this)+”服务器 答复:“+json”

我已经试过使用

Object.getClass().getEnclosuringMethod()

但是它总是返回null,并且应该返回调用它的方法名,对吗?正如文件所说

如果此类对象表示 方法,返回表示立即封闭的 基础类的方法。否则返回null。特别地, 如果基础类是局部类或局部类,则此方法返回null 立即由类型声明、实例包围的匿名类 初始值设定项或静态初始值设定项。
Return
Method基础函数的立即封闭方法 类,如果该类是本地类或匿名类;否则为空


如果你要直接打电话,我解释:

  • 你在A级,想记录你在这里
  • 您将直接从类A调用此方法
  • 您可以使用以下选项:

     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:[随机::测试()]


    使用slf4j和log4j,您可以随意配置输出,无需重新发明轮子…@TimothyTruckle感谢您的反馈,实际上android有自己的日志库,我只想在应用程序中的任何位置获得方法名称。“android有自己的日志库”-错:@TimothyTruckle谢谢我不知道。感谢您无法静态地找到索引元素[elements.length-2]抱歉,但是,为什么不呢?我的意思是,如果你想要调用方,它将是数组中最后一个。即使在调用
    Log.d时(STRING_标记,GlobalConfig.getRef(this)+“服务器响应:”+json)。这是获得所需信息的唯一方法,而无需循环遍历所有索引并按类名进行检查。根据您的代码,如果StackTrace中有其他元素,则会发生什么;public static void main(String[]args){r=new Random();new Thread(new Runnable(){public void run(){r.test();for(int i=0;i进行上述更改,然后重试),您无法修复该元素,并且它并不总是最后一个