NutzCN Logo
问答 获取调用本类的对象的类名!
发布于 3351天前 作者 javanan 1818 次浏览 复制 上一个帖子 下一个帖子
标签: dao

自己封装了个日志类,想获取调用该日志的对象类名!
日志类如下

```
public class L
{

private L()
{
    /* cannot be instantiated */
    throw new UnsupportedOperationException("cannot be instantiated");
}

public static boolean isDebug = true;// 是否需要打印bug,可以在application的onCreate函数里面初始化
private static  String TAG =L.class.getSimpleName();

// 下面四个是默认tag的函数
public static void i(String msg)
{
    if (isDebug)
        Log.i(TAG, msg);
}
```
另一个类调用日志

public class T{
public void test(){
L.i("hehe");
}
}
L.class.getSimpleName();
打印出来的是
L hehe
我想的是要
T hehe T也就是调用L的类名! 怎么实现呢? 前提是我不想再T中传入T对象然后在L中获取

4 回复

Logs.get() 就用了这个特性

/**
     * 返回以调用者的类命名的Log,是获取Log对象最简单的方法!
     */
    public static Log get() {
    	StackTraceElement[] sts = Thread.currentThread().getStackTrace();
    	if (Lang.isAndroid) {
    		for (int i = 0; i < sts.length; i++) {
				if (sts[i].getClassName().equals(Logs.class.getName())) {
					return adapter.getLogger(sts[i+1].getClassName());
				}
			}
    	}
    	return adapter.getLogger(sts[2].getClassName());
    }

adapter是 啥?

```
public static void t(){
System.out.println(getCallClassName());
}
public static String getCallClassName(){
StackTraceElement[] sts = Thread.currentThread().getStackTrace();
if (Lang.isAndroid) {
for (int i = 0; i < sts.length; i++) {
if (sts[i].getClassName().equals(Toolkit.class.getName())) {
return sts[i+1].getClassName();
}
}
}
return sts[2].getClassName();
}

public static final boolean isAndroid;
static {
    boolean flag = false;
    try {
        Class.forName("android.Manifest");
        flag = true;
    }
    catch (Throwable e) {}
    isAndroid = flag;
}
```
我在其他类调用 t()  
显示的还是 改方法所在的类名啊    不是调用他的类的名字
@wendal 

这个语句要调试的

return sts[2].getClassName();

不是2, 就是3, 大不了全部打印出来,找呗

ok
我在android 上看,,,,是6 。。 谢谢@wendal

添加回复
请先登陆
回到顶部