如何真正获得没有包的类的名称?

时间:2013-12-14 12:16:59

标签: java

我的问题故意标题几乎与this one完全相同,但我想要的是删除包名而不是其他。我的课程看起来像

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

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

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

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

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

看看这个:

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

    }

答案 2 :(得分:0)

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

<块引用>

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

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

byte[] blockContent = Encoding.UTF8.GetBytes(sender);
using (var ms = new MemoryStream(blockContent))
{
    appendBlobClient.AppendBlock(ms, blockContent.Length);
}

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

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