Java 如何在没有包的情况下真正获得类的名称?

Java 如何在没有包的情况下真正获得类的名称?,java,Java,我的问题的标题是故意的,几乎完全一样,但我想要的是去掉包名,而不是别的。我的课看起来像 class AProperlyAndDescriptivelyNamedClass { class First {...} class Next {...} class Last {...} } class AnotherTopLevelLongNamedClass { class First {...} class Next {...} class Last

我的问题的标题是故意的,几乎完全一样,但我想要的是去掉包名,而不是别的。我的课看起来像

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;
}
将输出

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

    }
公共静态字符串findName(对象o){
列表=新的ArrayList();

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

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

早期的答案没有采用这种方法,但我认为他们会因此而受苦。大致情况是:

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