今天写关于ListView滑动删除的效果时,用到了事件拦截机制等相关原理,万里长城当然不是一天就造好了,因此各种调试,输出日志,查看运行过程。
每一次写日志输出都是重复log.e("类名","方法名")等,有时候还要加上变量值。然后就突然想有没有简单的方法只需要输入log的方法名就可以了,因为Java是可以获得当前类名和方法名的。上网百度了一下,果然有,但是没有发现可以直接用的,于是准备闭门造车,自己做一个这样的工具类。
首先,当然是查阅获取当前类名和方法名的方法(感觉有点绕口。。。),对于类名,比较简单:
//不能获得需要的类名
String clazzName = this.getClass().getName();
return clazzName.substring(0, clazzName.lastIndexOf('$'));
// positionInStack是当前类的在栈中的位置
int positinInStack = 1;
StackTraceElement[] stacks = new Throwable().getStackTrace();
String className = stacks[positionInStack].getClassName();
<span style="white-space:pre"> </span>//对于方法名的获取,有两种方法:
<span style="white-space:pre"> </span>//方法1:通过Throwable的方法getStackTrace()</span>
<span style="white-space:pre"> </span>String funcName1 = new Throwable().getStackTrace()[1].getMethodName();
//方法2:通过Thread的方法getStackTrace()
String funcName2 = Thread.currentThread().getStackTrace()[2].getMethodName();
接着就是用一个类,把相关的方法封装起来。类名为:LogUtils。类中的方法均为static类型,有利于提高效率。我能想到的原因有二个:一是static方法比实例方法快大约15%(书上看到的)。二是避免了内存浪费。static方法不需要实例化类就可以使用,从而不必为每一个当前类实例化一个LogUtils对象。
最后附上部分代码,你可以根据自己的需要对功能进行扩展:
/**
* Created by zhangchao on 2016/2/20.
*/
public class LogUtils {
static final int positionInStack = 2;
public static String getCurrentClassName(){
StackTraceElement[] ste = new Throwable().getStackTrace();
return ste[positionInStack].getClassName();
}
public static String getCurrentMethodName(){
StackTraceElement[] ste = new Throwable().getStackTrace();
return ste[positionInStack].getMethodName();
}
public static void log_e(){
Log.e(getCurrentClassName(),getCurrentMethodName());
}
public static void log_e(int num){
Log.e(getCurrentClassName(),getCurrentMethodName()+num);
}
public static void log_e(double num){
Log.e(getCurrentClassName(),getCurrentMethodName()+num);
}
public static void log_e(String str){
Log.e(getCurrentClassName(),getCurrentMethodName()+str);
}
public static void log_i(){
Log.e(getCurrentClassName(),getCurrentMethodName());
}
public static void log_i(double num){
Log.e(getCurrentClassName(),getCurrentMethodName()+num);
}
public static void log_i(int num){
Log.e(getCurrentClassName(),getCurrentMethodName()+num);
}
public static void log_i(String str){
Log.e(getCurrentClassName(),getCurrentMethodName()+str);
}
}
代码的功能比较简单,就不注释了。