2009-10-01 117 views
4

這是訪問對象的bean屬性而不知道/關心其確切類型的適當方式嗎? (或者是否有內置方法已經這樣做?)當屬性不存在或不可用時,是否存在適當的異常?Java:通過反射訪問對象的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? 
} 

回答

3

如果您不能使用共享的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); 
    } 
} 
3

如果您不介意第三方依賴關係,那麼Commons BeanUtils等包裝會很好。否則,我建議看看Java BeanInfo課程,以提供您需要的內容。

IllegalArgumentException可能是一個合理的事情,但實際上,幾乎任何事情都會比吞噬異常更好。

+0

當然使用的java.beans更有意義比使用反射直接,如果你到達那裏試圖服從豆類標準。對於例外情況,吞嚥是做錯事的明確標誌(在使用反射的情況下,錯誤的事情可能是使用反射)。在這裏,即使是來自teh方法的未經檢查的異常也被吞下。我認爲不言而喻,這裏沒有安全保障。 – 2009-10-01 19:52:51

相關問題