【问题标题】:How to really get the name of a class without the package?如何在没有包的情况下真正获得类的名称?
【发布时间】:2014-01-02 04:55:44
【问题描述】:

我的问题被有意命名为几乎与this one 完全相同,但我想要的是去掉包名而不是别的。我的课看起来像

class AProperlyAndDescriptivelyNamedClass {
    class First {...}
    class Next {...}
    class Last {...}
}

class AnotherTopLevelLongNamedClass {
    class First {...}
    class Next {...}
    class Last {...}
}

如您所见,我为我的顶级类使用了一些长而描述性的类名,而在嵌套类中重复所有内容将是非常荒谬的。使用一些奇怪的快捷方式也不会更好。我总是使用它们的封闭类(而不是包)来引用这些类,这也是我想要打印它们的方式。

我知道我可以获取包名并从完整的类名中删除相应数量的字符,但我猜有人已经这样做了?

【问题讨论】:

    标签: java


    【解决方案1】:

    我猜你需要实现这样一个简短的方法:

    private static String getSimpleName(Class<?> clazz) {
        String simpleName = clazz.getSimpleName();
        if (clazz.isMemberClass()) {
            Class<?> enclosingClass = clazz.getEnclosingClass();
            simpleName = enclosingClass.getSimpleName() + "." + simpleName;
        }
        return simpleName;
    }
    

    然后

    String simpleName = getSimpleName(AnotherTopLevelLongNamedClass.First.class);
    System.out.println(simpleName);
    

    会输出

    AnotherTopLevelLongNamedClass.First
    

    【讨论】:

      【解决方案2】:

      看看这个:

          public static String findName (Object o){
              List<String> list = new ArrayList<String>();
              Class<? extends Object> clazz = o.getClass();
      
              list.add(clazz.getSimpleName());
              while (clazz.getEnclosingClass() != null) {
                  clazz = clazz.getEnclosingClass();
                  list.add(clazz.getSimpleName());
              }
      
              StringBuilder builder = new StringBuilder();
              for (int i=list.size()-1; i>=0; i--){
                  builder.append(list.get(i));
                  builder.append(".");
              }
              builder.delete(builder.length()-1, builder.length());
              return builder.toString();
      
          }
      

      【讨论】:

        【解决方案3】:

        我认为你已经描述了最好的方法。

        我知道我可以获取包名并从完整的类名中删除相应数量的字符,但我猜有人已经这样做了?

        较早的答案没有采用这种方法,但我认为他们为此受苦。大概是这样的:

        cl.getName().substring( cl.getPackageName().length() )
        

        考虑到边缘情况,这里有一个实现:

        /** Returns `cl.getName` stripped of any leading package qualifier.
          */
        String nameWithoutPackage( Class cl ) {
            String name = cl.getName();
            if( !cl.isArray() ) { // Then a package qualifier might lead the name.
                int strip = cl.getPackageName().length();
                if( strip > 0 ) name = name.substring( strip + /*dot separator*/1 ); }
            return name; }
        

        【讨论】:

          猜你喜欢
          • 2011-02-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-09-17
          • 2011-05-16
          • 1970-01-01
          • 2012-07-05
          • 1970-01-01
          相关资源
          最近更新 更多