dreamer
Member
В Java есть интересный стандарт —
Например:
К сожалению поскольку это только стандарт а не часть языка то взаимодействие со свойствами возможны только через рефлексию.
Считается что это довольно медленно.
Для работы со свойствами бинов я написал небольшой класс, который выполняет поиск всех свойств объекта и доступ к ним.
Измерения скорости показали, что доступ к свойствам через такой класс всего на 15% медленнее (при условии, что сам объект-обертка создается только раз, а доступ к свойствам многократный).
Приведу немного кода тут, для интересующихся:
Теперь можно делать такое:
А пользуетесь ли вы чем-то подобным?
You must be registered for see links
, основой которого являются правила именования геттеров/сеттеров (поскольку в 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());
Вкладення
-
1.7 КБ Перегляди: 94