我有一个简单的方法,总是让我回归" -undefined - "。
public static String getStereoType(Class<?> clazz) {
String result = "-undefined-";
if (clazz.isEnum()) {
result = "enum";
} else if (clazz.isInterface()) {
result = "interface";
} else if (clazz.isLocalClass() || clazz.isMemberClass()) {
result = "class";
}
return result;
}
当我用Object.class或Long.class调用此方法时,结果总是&#34; -undefined - &#34;。
List<Class<?>> superClazzes = ClassUtil.getSuperClazzList(clazz);
for (Class<?> c: superClazzess){
String stereoType = ClassUtil.getStereoType(c.getClass());
}
public static List<Class<?>> getSuperClazzList(Class<?> clazz) {
List<Class<?>> resultList = new ArrayList<Class<?>>();
Class<?> superClass = clazz.getSuperclass();
if (superClass != null) {
resultList.add(superClass);
resultList.addAll(getSuperClazzList(superClass));
}
return resultList;
}
答案 0 :(得分:1)
你想要得到什么?那么你需要什么样的立体声类型?我所知道的是:
从类API我可以发现你可能也有不同之处:
但它们可能对ULM图表一点都不感兴趣。
JVM toString()
中Class
的实现是:
public String toString() {
return (isInterface() ? "interface " : (isPrimitive() ? "" : "class ")) + getName();
}
这也可能会给你一些提示。
希望它有所帮助。
编辑:这应该可以胜任:
public static String getStereoType(Class<?> clazz) {
String result = "class";
if (clazz.isEnum()) {
result = "enum";
} else if (clazz.isInterface()) {
result = "interface";
}
else if (clazz.isPrimitive()) {
result = "primitive";
}
return result;
}
答案 1 :(得分:1)
要回答标题中的问题,isLocalClass()
不总是返回false
:它会为方法中声明的类型返回true
。同样,对于在另一种类型中声明的类型,isMemberClass()
返回true
。
考虑:
public class Outer {
interface MemberClass {}
public static void main(String[] args) {
class LocalClass {}
System.out.printf(
"%s/%s%n",
LocalClass.class.isLocalClass(),
LocalClass.class.isMemberClass()
);
System.out.printf(
"%s/%s%n",
MemberClass.class.isLocalClass(),
MemberClass.class.isMemberClass()
);
}
}
此代码执行后会打印出true/false
后跟false/true
。它们一起只计算在另一个类中或在方法中定义的类型。严格取决于目标类型是class
而不是interface
或enum
,因此您无法使用它来过滤。
请参阅@ Tarion对应采取的方法的优秀答案(并接受他的答案,因为它更能完全解决您的问题)。