[英]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.