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

标签 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:

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

异常(exception)是:

    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)

有什么线索吗?

最佳答案

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

关于java - 为什么这个使用反射的方法会抛出npe?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13175761/

相关文章:

Java MessageDigest 提供 31 位而不是 32 位

java - 同步(静态变量)的影响

c# - 通过 C# 中扩展方法的反射获取泛型重载

haskell - 以组合方式将异构提升类型反射回值

java - 有没有办法以声明的顺序从java类中获取私有(private)字段名称

在 Mac 上的 Android 中创建数据报套接字时出现 java.net.BindException

java - 使用此对象增加值不起作用

java - 如何在 Java 中获取对象数组的校验和

java - Realm java,如何通过字符串访问 RealmObject 属性(反射)

c# - 使用反射初始化对象的自动属性——有什么注意事项吗?