簡體   English   中英

如何在沒有包的情況下真正獲得類的名稱?

[英]How to really get the name of a class without the package?

我的問題被有意命名為幾乎完全一樣,但我想要的是剝離包名稱,僅此而已 我的課看起來像

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

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

正如你所看到的,我為我的頂級類使用了一些長而描述性的類名,並且重復嵌套類中的所有內容將是非常荒謬的。 使用一些奇怪的快捷方式也不會更好。 我總是使用它們的封閉類(並且沒有包)來引用這些類,這也是我想要打印它們的方式。

我知道我可以獲取包名並從完整的類名中刪除相應數量的字符,但我猜有人已經這樣做了?

我想你需要實現一個像這樣的簡短方法:

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

看看這個:

    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();

    }

我想你已經描述了最好的方法。

我知道我可以獲取包名並從完整的類名中刪除相應數量的字符,但我猜有人已經這樣做了?

較早的答案沒有采用這種方法,但我認為他們為此受苦。 大概是:

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; }

java.lang.Class<T>中有一個方法getSimpleName() ,它確實只返回類的名稱。

資源

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM