4

这是在不知道/关心其确切类型的情况下访问对象的 bean 属性的适当方法吗?(或者是否已经有内置方法可以做到这一点?)当属性不存在或不可用时是否有适当的异常抛出?

static private Object getBeanPropertyValue(Object bean, String propertyName) {
    // access a no-arg method through reflection
    // following bean naming conventions
    try {
        Method m = bean.getClass().getMethod(
                "get"
                +propertyName.substring(0,1).toUpperCase()
                +propertyName.substring(1)
                , null);
        return m.invoke(bean);
    }
    catch (SecurityException e) {
        // (gulp) -- swallow exception and move on
    }
    catch (NoSuchMethodException e) {
        // (gulp) -- swallow exception and move on
    }
    catch (IllegalArgumentException e) {
        // (gulp) -- swallow exception and move on
    }
    catch (IllegalAccessException e) {
        // (gulp) -- swallow exception and move on
    }
    catch (InvocationTargetException e) {
        // (gulp) -- swallow exception and move on
    }
    return null; // it would be better to throw an exception, wouldn't it?
}
4

3 回答 3

3

如果您不介意第三方依赖,那么像 Commons BeanUtils 这样的包装器会很好。否则,我建议查看Java BeanInfo类以提供您需要的内容。

IllegalArgumentException 可能是一个合理的抛出,但实际上,几乎任何事情都比仅仅吞下异常要好。

于 2009-10-01T19:45:41.050 回答
3

如果你不能使用 Commons BeanUtils,你可以使用 jre 类

java.beans.Introspector

BeanInfo beanInfo = Introspector.getBeanInfo(bean.getClass());
PropertyDescriptor[] descriptors = beanInfo.getPropertyDescriptors();
for(PropertyDescriptor pd : descriptors)
{
    if(pd.getName().equals(propertyName)
    {
        return pd.getReadMethod().invoke(bean, (Object[])null);
    }
}
于 2009-10-01T20:23:04.843 回答
2

嗯...这不会处理布尔值(例如'isActive()`)或嵌套/索引属性。

我建议你看看Commons BeanUtils而不是自己写这个。

BeanUtils.getProperty()做你想做的事。也不吞下异常:-)

于 2009-10-01T19:25:02.107 回答