【问题标题】:generic way of getting class name获取类名的通用方法
【发布时间】:2011-08-09 16:41:40
【问题描述】:

什么是动态的静态等价物

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

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

静态字符串 CLASS_NAME = Foo.class.getCanonicalName()

谢谢。

【问题讨论】:

  • 第一个不应该是this.getClass().getCanonicalName()吗?
  • 不是手写名字吗?
  • 如果您知道自己的类型(因为您想使用static 块),为什么还需要泛型?
  • @Ken 泛型与非特定而非 java 泛型一样。

标签: java


【解决方案1】:

不确定我是否理解您的问题 - 您是否尝试过 this.getClass().getCanonicalName()

【讨论】:

  • @Saideira:我迷路了。你到底想达到什么目标?
  • @home:他的新答案非常自我描述。
  • @home 我想知道是否可以在没有实例的情况下以通用名称获取类名
  • @Ken Wayne VanderLinde:是的,看起来你的答案是正确的 :-)
【解决方案2】:

有一个可怕的黑客攻击

class MyClass{
    private static String cannonicalName;
    static{
      cannonicalName = new Object(){}.getEnclosingClass().getCannonicalName();
    }    
}

这就是你要找的吗? 它确实以通用和静态的方式为您提供了类名,但您仅为它创建了一个匿名类。

【讨论】:

    【解决方案3】:

    我认为你想要做的是:

    public static <T> String getCanonicalName() {
        return T.class.getCanonicalName();
    }
    

    但我相信您已经发现这不起作用。这是因为 Java 泛型依赖于类型擦除。也就是说,T 只存在于编译时。在运行时,T 不再可访问。

    一般来说,要做到这一点,您必须像在第一个示例中那样使用该类型的实例。

    编辑

    在意识到你的问题的真实性质后,我不会直接回答。

    我见过一些像下面这样的“黑客”

    static String ClassName = Thread.currentThread().getStackTrace[0].getClassName();
    

    这获取了类的名称,但我很确定它不会与getCanonicalName() 返回的名称相同,而且我真的不知道将getClassName() 的输出转换为的方法getCanonicalName() 的输出。

    我认为 Java 语言有一个改变,它可以真正帮助开发人员编写直观的代码:如果可以添加某种 self 关键字来引用当前类,它将简化像你这样的任何场景,通过允许您编写诸如self.class.getCanonicalName() 之类的内容。但是,就目前情况而言,我们没有那个,所以你想做的事情是不可能直接实现的。

    还有其他可能的解决方法。例如,您可以尝试以下操作:

     static String ClassName = null;
    
     public Foo() {
         if(ClassName == null)
             ClassName = this.getClass().getCanonicalName();
     }
    

    但这要求你的类是可构造的,这并不总是可取的。如果我们有一个 self 关键字,它也不会那么简单。

    【讨论】:

      【解决方案4】:

      不太明白你的意思,也许这就是你所追求的:

      public static String getCanonicalName(Class<?> clazz){
          return clazz.getCanonicalName();
      }
      

      【讨论】:

        猜你喜欢
        • 2012-07-31
        • 2019-04-08
        • 2012-03-04
        • 1970-01-01
        • 2011-07-01
        • 1970-01-01
        • 2015-12-19
        • 1970-01-01
        • 2012-04-16
        相关资源
        最近更新 更多