我知道这很小,但在每个班级的顶部,我最终都会复制并粘贴,然后更改以下代码行。
private static final String TAG = MyClass.class.getName();
我想做的是每次复制时都不必修改MyClass位。
即。我想写这个。
private static final String TAG = this.class.getName();
但显然现在没有这个。我知道它很小,但我通常从SO答案中学到一些东西,并且确实学到了一些好东西,只是在寻找是否有答案。
答案 0 :(得分:7)
您可以定义名为tag
的 Eclipse模板,例如:
private static final String TAG = ${enclosing_type}.class.getName();
然后,键入tag
后跟Ctrl+Space
,它将插入此语句。
我使用此方法在我的类中声明记录器。
或者,查询当前线程的堆栈跟踪:
private static final String TAG = Thread.currentThread().getStackTrace()[1].getClassName();
答案 1 :(得分:3)
一个丑陋的黑客但是,这会给你当前的类名:
private static String tag = new RuntimeException()。getStackTrace()[0] .getClassName();
答案 2 :(得分:2)
不幸的是,没有办法避免这种情况。您必须明确指定每个类的类标记。反思可能会提供一些处理这个问题的一般方法,但它会更难看,因此不值得考虑: - )
答案 3 :(得分:1)
this
代表具体的东西。对于Class级别的东西,使用类名或者只是在类中调用它们时才显式调用它们。
答案 4 :(得分:1)
你不知道我是多么想要这样的事情(this.class
),但遗憾的是,没有。
答案 5 :(得分:1)
用户dogbane建议查询当前Thread
的堆栈跟踪。
有人可能会将该代码移出一个名为ClassInfo
的类:
package util;
public class ClassInfo {
private ClassInfo() {}
static public String className() {
return Thread.currentThread().getStackTrace()[2].getClassName();
}
}
然后,从静态上下文中,如果我们使用静态导入,我们可以通过引用ClassInfo.className()
或简单地className()
来获取类名。
示例:
import static util.ClassInfo.className;
public class MyClass {
public static void main(String[] args) {
System.out.println( className() );
Inner.print();
}
private static class Inner {
static void print() {
System.out.println( className() );
}
}
}
输出:
MyClass MyClass$Inner