为什么这种使用反射的方法会抛出npe?

时间:2012-11-01 11:08:26

标签: java reflection

我有一些static final String字段,我想使用反射获取它们的值,所以我做了一个这样的方法:

public String getLogoSrc(final String provider) {
    if (provider.equals(StringUtils.EMPTY)) {
        return StringUtils.EMPTY;
    }

    logger.info("---provider is: "+provider);

    for (Field f : ConstantsBean.class.getDeclaredFields()) {
        f.setAccessible(true);
        if (f.getName().contains(provider.toUpperCase().replace(" ", "_"))) {
            try {
                return f.get(null) != null?  f.get(null).toString() : "";
            } catch (IllegalArgumentException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }

    return StringUtils.EMPTY;
}

我只是不明白为什么在尝试返回值时总是会收到NPE:

return f.get(null) != null? f.get(null).toString() : "";

例外是:

    java.lang.NullPointerException
        at sun.reflect.UnsafeFieldAccessorImpl.ensureObj(UnsafeFieldAccessorImpl
.java:36)
        at sun.reflect.UnsafeObjectFieldAccessorImpl.get(UnsafeObjectFieldAccess
orImpl.java:18)
        at java.lang.reflect.Field.get(Field.java:358)
        at com.gravitant.cloud.common.jsf.core.beans.ConstantsBean.getLogoSrc(Co
nstantsBean.java:195)

有任何线索吗?

4 个答案:

答案 0 :(得分:3)

在访问之前打印字段。我怀疑你正在尝试访问一个非静态字段,因此无法接受将null传递给field.get()

答案 1 :(得分:3)

请参阅here

get(Object obj)

  

如果指定的obj参数为null,则该方法抛出一个   的NullPointerException。

答案 2 :(得分:2)

您将null作为指定对象传递。即你这样做:

null.fieldname

您需要将引用传递给您想要该字段的对象。该字段对象表示通用字段,而不是特定对象上的字段。

这同样适用于通过反射的方法。您必须传入要将方法应用于的对象的引用。

答案 3 :(得分:0)

使用

调用field.get(obj)时

<强>参数: obj - 从中​​提取所表示字段值的对象

<强>返回: 对象obj中表示的字段的值;原始值在返回之前包装在适当的对象中

<强>抛出: IllegalAccessException - 如果基础字段无法访问。

IllegalArgumentException - 如果指定的对象不是声明基础字段(或其子类或实现者)的类或接口的实例。

NullPointerException - 如果指定的对象为null且该字段是实例字段。

ExceptionInInitializerError - 如果此方法引发的初始化失败。