在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。