Получить свойство Observable - PullRequest
0 голосов
/ 03 июля 2019

В E3 следующий способ был правильным для создания IObservableValue:

modelObservable = PojoObservables.observeDetailValue((IObservableValue) this.model, this.property, null);
// or
modelObservable = PojoObservables.observeValue(this.model, this.property);

Тогда вы можете получить собственность от этого modelObservable через:

String property = ((IBeanObservable) modelObservable).getPropertyDescriptor().getName();

Теперь с E4 правильный способ создания IObservableValue:

modelObservable = PojoProperties.value(this.property).observeDetail((IObservableValue) this.model);
// or
modelObservable = PojoProperties.value(this.property).observe(this.model);

Однако метод getPropertyDescriptor() теперь возвращает ноль. Как я могу получить свойство этого modelObservable в общем виде?

1 Ответ

0 голосов
/ 05 июля 2019

Лучшее, что я могу сделать, - это метод:

public static final String findProperty(final IObservable target) {
    String property = null;

    if (target instanceof IBeanObservable) {
        final PropertyDescriptor desc = ((IBeanObservable) target).getPropertyDescriptor();
        property = desc == null ? null : desc.getName();
    }
    if (property == null && target instanceof DecoratingObservableValue) {
        property = getPropertyOfDecorator((DecoratingObservableValue<?>) target);
    }
    return property;
}

private static String getPropertyOfDecorator(DecoratingObservableValue<?> target) {
    try {
        final Field decoratedField = DecoratingObservableValue.class.getDeclaredField("decorated");
        decoratedField.setAccessible(true);
        final Object decorated = decoratedField.get(target);
        if (decorated != null) {
            return findProperty((IObservable) decorated);
        }
        return null;
    } catch (final Exception e) {
        e.printStackTrace();
        return null;
    }
}
...