Невозможно сделать это. Но вы можете определить свою собственную калибровочную модель, чтобы сделать это через отражение. Например:
public class FunctionReflectionReadOnlyModel<T, R> extends AbstractReadOnlyModel<T> {
private Object object;
private String functionName;
private R key;
private Class<R> keyClass;
public FunctionReflectionReadOnlyModel(Object object, String expression, Class<R> keyClass) {
this.object = object;
this.functionName = getFunctionName(expression);
this.key = getKey(expression);
this.keyClass = keyClass;
}
@Override
public T getObject() {
try {
Method method = object.getClass().getMethod(functionName, keyClass);
return (T)method.invoke(object, key);
} catch (Exception ex) {
//process exception
return null;
}
}
}
Вам просто нужно реализовать getFunctionName (выражение String) и GETKEY (выражение String) от ваших потребностей.
Но я думаю, что лучше использовать другой вариант. Это не особенно то, что вы просите, но это типично. Также требуется Java 8.
public class FunctionWithKeyReadOnlyModel<T, R> extends AbstractReadOnlyModel<T> {
private Function<R, T> function;
private R key;
public FunctionWithKeyReadOnlyModel(Function<R, T> function, R key) {
this.function = function;
this.key = key;
}
@Override
public T getObject() {
return function.apply(key);
}
}
И тогда вы можете использовать его как это:
new FunctionWithKeyReadOnlyModel(obj::getStringValue, "key");
Я читал об использовании только PropertyModel слишком поздно. В этом случае вы можете наследовать свой класс из PropertyModel и изменять getModel/setModel, как в примере FunctionReflectionReadOnlyModel. Поэтому вам не нужно менять API других классов. Но если вы хотите, чтобы все функции PropertyModel (вложенные объекты) вам нужно реализовать.
Я работаю с TextFilteredPropertyColumn, поэтому я хотел бы выяснить способ справиться с этим в PropertyModel, так как изменение типа модели было бы большим переустройством нескольких классов для небольшой выгоды. – JeredM