关于java:如何真正获取没有包的类的名称?

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

我的问题是有意命名几乎完全像这一个,但我想要的是剥离包的名称,而不是其他任何东西。我的课看起来像

1
2
3
4
5
6
7
8
9
10
11
class AProperlyAndDescriptivelyNamedClass {
    class First {...}
    class Next {...}
    class Last {...}
}

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

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

我知道我可以得到包名并从完整的类名中去掉相应数量的字符,但我想已经有人做了吗?


我想您需要实现这样一个简短的方法:

1
2
3
4
5
6
7
8
private static String getSimpleName(Class<?> clazz) {
    String simpleName = clazz.getSimpleName();
    if (clazz.isMemberClass()) {
        Class<?> enclosingClass = clazz.getEnclosingClass();
        simpleName = enclosingClass.getSimpleName() +"." + simpleName;
    }
    return simpleName;
}

然后

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

意志输出

1
AnotherTopLevelLongNamedClass.First

看看这个:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    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();

    }