获得类名的通用方法

时间:2011-08-09 16:41:41

标签: java

什么是动态

的静态等价物
  

String CLASS_NAME = this.getClass()。getCanonicalName()

请注意,以下不是我正在寻找的内容,因为它特别指的是特定的类。我想在方法之外引用类名(即在静态{}部分中)

  

static String CLASS_NAME = Foo.class.getCanonicalName()

感谢。

4 个答案:

答案 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();
}