在Java/Android中的任意位置获取类名和方法名
我是android开发者,非常喜欢日志记录。我对我的日志使用了一种约定,即 [ClassName:methodName()] 每当我必须记录一些东西时,这可以帮助我找到生成特定日志的确切位置,在许多情况下都很有用 而不是每次都写 类名 及 方法名 我手动编写了一个方法。他们可能是做这件事的更好方法。任何不使用循环的答案都被接受在Java/Android中的任意位置获取类名和方法名,java,android,Java,Android,我是android开发者,非常喜欢日志记录。我对我的日志使用了一种约定,即 [ClassName:methodName()] 每当我必须记录一些东西时,这可以帮助我找到生成特定日志的确切位置,在许多情况下都很有用 而不是每次都写 类名 及 方法名 我手动编写了一个方法。他们可能是做这件事的更好方法。任何不使用循环的答案都被接受 public static String getRef(Object object) { StackTraceElement[] elements = T
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基础函数的立即封闭方法 类,如果该类是本地类或匿名类;否则为空
如果你要直接打电话,我解释:
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进行上述更改,然后重试),您无法修复该元素,并且它并不总是最后一个