ReflectionUtil getField抛出NullPointerException

时间:2011-03-02 09:12:27

标签: java reflection nullpointerexception

我使用一个通过FilterCriterionList(有点查找器)创建Hibernate查询的类,它一直工作到现在为止并触发NullPointerException,我完全不知道为什么它会被触发。

这是一个方法(在ReflectionUtil中),它使用以下值触发nullpointer(请注意,抛出的其他值可以完美地工作,而且只是这些似乎给出了错误):

type = interface java.util.List

fieldName = parameter

首先它抛出NoSuchFieldException并在它的第二次运行(因为它在field = getField(type.getSuperclass(),fieldName)再次调用;)使它抛出NullPointerException并且停止死亡(所有这些都发生在我的UnitTest中,而不是实时环境尚未)。

public static Field getField(Class type, String fieldName) {
        Field field = null;
        try {
            field = type.getDeclaredField(fieldName);
        } catch (Exception e) {
            if (!type.equals(Object.class)) {
                field = getField(type.getSuperclass(), fieldName);
            }
        }
        return field;
    }

关于为什么会发生这种情况的任何想法(或者我可以做些什么来解决它?)。我无法真正展示更多代码,因为它非常复杂,而且是公司代码。

3 个答案:

答案 0 :(得分:1)

java.util.List是一个界面,因此在其上调用getSuperclass()会产生null

以递归方式应用getField()的正确方法如下:

} catch (Exception e) {
    Class superclass = type.getSuperclass();
    if (superclass != null) {
        field = getField(superclass, fieldName);
    }
}

答案 1 :(得分:0)

你打电话是这样的:

getField(List.class, "parameter");

它本来不会工作,因为List是一个接口而且它没有任何名为参数的字段。对于第二个调用,它的'null因为接口List donet有一个超类。

答案 2 :(得分:0)

来自Class.getSuperclass文档

  

返回表示的类   实体的超类(类,   接口,原始类型或void)   由本课程代表。 如果这样   Class表示Object   class,接口,原始类型,   或者void,然后返回null 。如果   此对象表示数组类   然后是表示对象的Class对象   返回对象类。