Java: доступ к методам объекта типа bean через отражение - PullRequest
4 голосов
/ 01 октября 2009

Является ли это подходящим способом доступа к свойствам бина объекта, не зная / не заботясь о его точном типе? (Или есть встроенный метод, который уже делает это?) Существует ли соответствующее исключение, которое выдается, когда свойство не существует или недоступно?

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 ]

3 голосов
/ 01 октября 2009

Обертка типа Commons BeanUtils была бы хороша, если вы не возражаете против сторонней зависимости. В противном случае я бы посоветовал взглянуть на класс Java BeanInfo , чтобы получить то, что вам нужно.

IllegalArgumentException может быть разумным решением, но на самом деле почти все будет лучше, чем просто проглотить исключение.

3 голосов
/ 02 октября 2009

Если вы не можете использовать 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);
    }
}
2 голосов
/ 01 октября 2009

Умм ... это не будет обрабатывать логические (например, isActive () `) или вложенные / индексированные свойства.

Я предлагаю вам взглянуть на Commons BeanUtils вместо того, чтобы пытаться написать это самостоятельно.

BeanUtils.getProperty () делает то, что вы хотите. Также не глотает исключения: -)

...