Java Reflection & Beans

dreamer

Member
В Java есть интересный стандарт — , основой которого являются правила именования геттеров/сеттеров (поскольку в Java нет свойств /properties/).
Например:
Код:
interface SomeBean {
    int getAge();
    void setAge(int age);
    boolean isVisible();
    void setVisible(boolean value);
    String getName();
}
К сожалению поскольку это только стандарт а не часть языка то взаимодействие со свойствами возможны только через рефлексию.
Считается что это довольно медленно.
Для работы со свойствами бинов я написал небольшой класс, который выполняет поиск всех свойств объекта и доступ к ним.
Измерения скорости показали, что доступ к свойствам через такой класс всего на 15% медленнее (при условии, что сам объект-обертка создается только раз, а доступ к свойствам многократный).
Приведу немного кода тут, для интересующихся:
Код:
public class PropertyMapper {

    public PropertyMapper(Object bean) {
        this.bean = bean;
        Method[] methods = bean.getClass().getMethods();
        for (int i = 0; i < methods.length; i++) {
            if (isGetter(methods[i])) {
                String name = methods[i].getName().substring(
                    methods[i].getName().startsWith("get") ? 3 : 2);
                if (name.length() > 0)
                    getters.put(transformName(name), methods[i]);
            }
            else if (isSetter(methods[i])) {
                String name = methods[i].getName().substring(3);
                if (name.length() > 0)
                    setters.put(transformName(name), methods[i]);
            }
        }
    }
    public void set(String property, Object value) throws Throwable {
        try {
            setters.get(property).invoke(bean, value);
        }
        catch (IllegalAccessException e) {
            throw new RuntimeException(e);
        }
        catch (InvocationTargetException e) {
            throw e.getCause();
        }
    }
    public Object get(String property) throws Throwable {
        try {
            return getters.get(property).invoke(bean);
        }
        catch (IllegalAccessException e) {
            throw new RuntimeException(e);
        }
        catch (InvocationTargetException e) {
            throw e.getCause();
        }
    }
}
Теперь можно делать такое:
Код:
PropertyMapper bean = new PropertyMapper(new SomeBean());
bean.set("age", new Integer(5));
value = bean.get("name");
for (String param : bean.getPropertyNames(bean.GETTER))
    System.out.println(param +" = "+ bean.get(param));
bean.setProperties(httpRequest.getPrequestParameterMap());
А пользуетесь ли вы чем-то подобным?
 

Вкладення

Зверху