2

我有一些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

4 回答 4

5

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

于 2012-11-01T11:12:26.173 回答
3

这里

get(Object obj)

如果指定的 obj 参数为 null,则该方法将引发 NullPointerException。

于 2012-11-01T11:12:46.483 回答
2

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

null.fieldname

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

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

于 2012-11-01T11:13:03.997 回答
0

当您调用 field.get(obj) 时

参数: obj - 要从中提取表示字段值的对象

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

抛出: IllegalAccessException - 如果基础字段不可访问。

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

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

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

于 2012-11-01T11:14:31.610 回答