在Java中有一个静态版本的'this'

时间:2011-01-25 11:04:46

标签: java

我知道这很小,但在每个班级的顶部,我最终都会复制并粘贴,然后更改以下代码行。

private static final String TAG = MyClass.class.getName();

我想做的是每次复制时都不必修改MyClass位。

即。我想写这个。

private static final String TAG = this.class.getName();

但显然现在没有这个。我知道它很小,但我通常从SO答案中学到一些东西,并且确实学到了一些好东西,只是在寻找是否有答案。

6 个答案:

答案 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