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を使用できない場合は、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 に答える