为什么Class.isLocalClass总是Boolean.FALSE?

时间:2014-08-25 19:16:19

标签: java class reflection stereotype

我有一个简单的方法,总是让我回归" -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;
    }

2 个答案:

答案 0 :(得分:1)

你想要得到什么?那么你需要什么样的立体声类型?我所知道的是:

  • 枚举
  • 接口
  • 原语(例如,双倍,但双倍)
  • 班级(其他一切!)

从类API我可以发现你可能也有不同之处:

  • 注释(实际是java中的接口)
  • 合成(我不知道这是什么)
  • local(在方法中定义)

但它们可能对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而不是interfaceenum,因此您无法使用它来过滤。

请参阅@ Tarion对采取的方法的优秀答案(并接受他的答案,因为它更能完全解决您的问题)。