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

在Java中有一个静态版本的';这';,java,Java,我知道这很小,但在每个类的顶部,我都会复制和粘贴,然后更改下面的代码行 private static final String TAG = MyClass.class.getName(); 我想做的是不必每次复制时都修改MyClass位 i、 我想写这个 private static final String TAG = this.class.getName(); 但很明显,在这一点上没有这样的问题。我知道它的次要部分,但我通常从这些答案中学到了一些东西,并且确实学到了一些好东西,只是为了看

我知道这很小,但在每个类的顶部,我都会复制和粘贴,然后更改下面的代码行

private static final String TAG = MyClass.class.getName();
我想做的是不必每次复制时都修改MyClass位

i、 我想写这个

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

但很明显,在这一点上没有这样的问题。我知道它的次要部分,但我通常从这些答案中学到了一些东西,并且确实学到了一些好东西,只是为了看看是否已经有了答案。

这个
代表特定的东西。对于类级别的内容,如果您是从类内部调用,请使用类名或直接调用它们。

不幸的是,无法避免这种情况。必须为每个类显式指定类标记。反射可能会提供一些通用的方法来处理这个问题,但它会更加丑陋,不值得考虑:-)你不知道我是多么希望这样(
this.class
),但遗憾的是,不。

你可以定义一个名为
标记的Eclipse模板,例如:

private static final String TAG = ${enclosing_type}.class.getName();
然后,键入
tag
,后跟
Ctrl+Space
,它将插入此语句

我使用此方法在类中声明记录器

或者,查询当前线程的堆栈跟踪:

private static final String TAG = Thread.currentThread().getStackTrace()[1].getClassName();

一个丑陋的黑客,但这会给你当前的类名:


私有静态字符串标记=new RuntimeException().getStackTrace()[0].getClassName()

用户dogbane建议查询当前
线程的堆栈跟踪。
可以将该代码移出到名为
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 类名 MyClass$Inner
反射是不可能的。您必须从某个地方的
类开始,这已经是第一个问题了。如果您用有效的类名键入MyClass.Class,也很容易出错。不止一次发生在我身上;-)或者,如果您对剪切粘贴“重用”
newobject(){}.getClass().getenclosuringclass()
,或者类似于在重复问题中提到的那样,不太在意。(需要额外花费。)喜欢它,比抛出和捕获异常要好。getStackTrace()[1]或getStackTrace()[0],如后所述?应该是线程上的getStackTrace()[1]。另一个答案是不同的,因为它创建了一个新的RuntimeException。