什么是动态
的静态等价物String CLASS_NAME = this.getClass()。getCanonicalName()
请注意,以下不是我正在寻找的内容,因为它特别指的是特定的类。我想在方法之外引用类名(即在静态{}部分中)
static String CLASS_NAME = Foo.class.getCanonicalName()
感谢。
答案 0 :(得分:4)
不确定我是否理解您的问题 - 您是否尝试this.getClass().getCanonicalName()
?
答案 1 :(得分:4)
有一个可怕的黑客
class MyClass{
private static String cannonicalName;
static{
cannonicalName = new Object(){}.getEnclosingClass().getCannonicalName();
}
}
这就是你要找的东西吗? 它确实以通用和静态的方式为您提供类名,但您只是为它创建了一个匿名类。
答案 2 :(得分:3)
我认为你要做的是:
public static <T> String getCanonicalName() {
return T.class.getCanonicalName();
}
但我确信你已经发现这不起作用。这是因为Java泛型依赖于类型擦除。也就是说,T
仅在编译时存在。在运行时,T
不再可访问。
要做到这一点,你必须像第一个例子中那样使用该类型的实例。
在意识到问题的真实性之后,我没有直接回答。
我见过某些“黑客”,如下所示
static String ClassName = Thread.currentThread().getStackTrace[0].getClassName();
这得到了类的名称,但我很确定它与getCanonicalName()
返回的名称不一样,我真的不知道如何转换{{}的输出1}}进入getClassName()
的输出。
我认为Java语言的改变确实可以帮助开发人员编写直观的代码:如果可以添加某种getCanonicalName()
关键字,请参考当前的类,它将简化任何场景,如你的,允许你写self
之类的东西。但是,就目前而言,我们没有那样做,所以你想做的事情不是直接可能的。
还有其他可行的解决方法。例如,您可以尝试类似:
self.class.getCanonicalName()
但这要求你的班级是可构造的,这并不总是可取的。如果我们有一个 static String ClassName = null;
public Foo() {
if(ClassName == null)
ClassName = this.getClass().getCanonicalName();
}
关键字,它也不会那么简单。
答案 3 :(得分:0)
不太明白你的意思,也许这就是你所追求的:
public static String getCanonicalName(Class<?> clazz){
return clazz.getCanonicalName();
}