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

Cri*_*riu 2 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;
}
Run Code Online (Sandbox Code Playgroud)

我根本不明白为什么在尝试返回值时总是收到 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)
Run Code Online (Sandbox Code Playgroud)

有什么线索吗?

JB *_*zet 5

在访问该字段之前先打印该字段。我怀疑您正在尝试访问非静态字段,field.get()因此将 null 传递给是不可接受的。

  • @CristianBoariu 检查它是否是静态的: `if (java.lang.reflect.Modifier.isStatic(f.getModifiers()))` (2认同)