我有一些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)
有任何线索吗?
答案 0 :(得分:3)
在访问之前打印字段。我怀疑你正在尝试访问一个非静态字段,因此无法接受将null传递给field.get()
。
答案 1 :(得分:3)
答案 2 :(得分:2)
您将null作为指定对象传递。即你这样做:
null.fieldname
您需要将引用传递给您想要该字段的对象。该字段对象表示通用字段,而不是特定对象上的字段。
这同样适用于通过反射的方法。您必须传入要将方法应用于的对象的引用。
答案 3 :(得分:0)
使用
调用field.get(obj)时<强>参数:强> obj - 从中提取所表示字段值的对象
<强>返回:强> 对象obj中表示的字段的值;原始值在返回之前包装在适当的对象中
<强>抛出:强>
IllegalAccessException
- 如果基础字段无法访问。
IllegalArgumentException
- 如果指定的对象不是声明基础字段(或其子类或实现者)的类或接口的实例。
NullPointerException
- 如果指定的对象为null且该字段是实例字段。
ExceptionInInitializerError
- 如果此方法引发的初始化失败。