Альтернатива BeanUtils.getProperty()

Я ищу альтернативу BeanUtils.getProperty()Единственная причина, по которой я хочу иметь альтернативу, состоит в том, чтобы у конечного пользователя не было еще одной зависимости.

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

final Object firstObj = BeanUtils.getProperty(value, this.firstFieldName);
final Object secondObj = BeanUtils.getProperty(value, this.secondFieldName);

Так как мне нужно получить эти два свойства из объекта. Есть ли альтернатива для этого без какой-либо сторонней системы, или мне нужно скопировать этот кусок кода из BeanUtilsBean?

2 ответа

Решение

BeanUtils очень мощный, потому что он поддерживает вложенные свойства. EG "bean.prop1.prop2", ручка MapS как бобы и DynaBeans.

Например:

 HashMap<String, Object> hashMap = new HashMap<String, Object>();
 JTextArea value = new JTextArea();
 value.setText("jArea text");
 hashMap.put("jarea", value);

 String property = BeanUtils.getProperty(hashMap, "jarea.text");
 System.out.println(property);

Таким образом, в вашем случае я бы просто написал приватный метод, который использует java.beans.Introspector,

private Object getPropertyValue(Object bean, String property)
        throws IntrospectionException, IllegalArgumentException,
        IllegalAccessException, InvocationTargetException {
    Class<?> beanClass = bean.getClass();
    PropertyDescriptor propertyDescriptor = getPropertyDescriptor(
            beanClass, property);
    if (propertyDescriptor == null) {
        throw new IllegalArgumentException("No such property " + property
                + " for " + beanClass + " exists");
    }

    Method readMethod = propertyDescriptor.getReadMethod();
    if (readMethod == null) {
        throw new IllegalStateException("No getter available for property "
                + property + " on " + beanClass);
    }
    return readMethod.invoke(bean);
}

private PropertyDescriptor getPropertyDescriptor(Class<?> beanClass,
        String propertyname) throws IntrospectionException {
    BeanInfo beanInfo = Introspector.getBeanInfo(beanClass);
    PropertyDescriptor[] propertyDescriptors = beanInfo
            .getPropertyDescriptors();
    PropertyDescriptor propertyDescriptor = null;
    for (int i = 0; i < propertyDescriptors.length; i++) {
        PropertyDescriptor currentPropertyDescriptor = propertyDescriptors[i];
        if (currentPropertyDescriptor.getName().equals(propertyname)) {
            propertyDescriptor = currentPropertyDescriptor;
        }

    }
    return propertyDescriptor;
}

Если вы используете SpringFramework, "BeanWrapperImpl" - это ответ, который вы ищете:

BeanWrapperImpl wrapper = new BeanWrapperImpl(sourceObject);

Object attributeValue = wrapper.getPropertyValue("attribute");
Другие вопросы по тегам