Java JFace数据绑定不支持默认方法
Java8中有一个令人惊讶的新特性:接口上的默认方法。令人惊讶的是,即使是JDK自己的bean也能做到这一点。由于Java8是全新的,只发布了一年左右,所以我们可以放心地认为它不会很快得到修复 所有这些都意味着JFace数据绑定也不可能支持默认方法,正如您所想象的,这是一个问题。我们已经有了一个自己的instrostect,但是有人知道我们如何扩展/修复/修补数据绑定以使用它而不是不工作的默认绑定吗 一些细节:对于bug报告的界面:Java JFace数据绑定不支持默认方法,java,eclipse-plugin,jface,Java,Eclipse Plugin,Jface,Java8中有一个令人惊讶的新特性:接口上的默认方法。令人惊讶的是,即使是JDK自己的bean也能做到这一点。由于Java8是全新的,只发布了一年左右,所以我们可以放心地认为它不会很快得到修复 所有这些都意味着JFace数据绑定也不可能支持默认方法,正如您所想象的,这是一个问题。我们已经有了一个自己的instrostect,但是有人知道我们如何扩展/修复/修补数据绑定以使用它而不是不工作的默认绑定吗 一些细节:对于bug报告的界面: public static interface Named {
public static interface Named {
public default String getName() {
return "always the same";
}
}
例外情况如下所示:
java.lang.IllegalArgumentException: name property does not have a read method.
at org.eclipse.core.internal.databinding.beans.BeanPropertyHelper.readProperty(BeanPropertyHelper.java:94)
at org.eclipse.core.internal.databinding.beans.PojoValueProperty.doGetValue(PojoValueProperty.java:47)
at org.eclipse.core.databinding.property.value.ValueProperty.getValue(ValueProperty.java:57)
我们确实使用了databinding 1.4.0,这是下载站点为Eclipse4.4.2提供的版本,我在某处看到了1.4.2版本,但经过一些徒劳的尝试后,我开始相信交换插件超出了我的能力。在指定如下接口类型时,我能够绑定到默认方法支持的属性:
IObservableValue observableValue = PojoProperties.value( Named.class, "name" ).observe( realm, named );
observableValue.setValue( "name" );
如果这种方法不适合您,您可以自己创建一个PojoValueProperty
并传入自定义创建的PropertyDescriptor
PropertyDescriptor propertyDescriptor = ...
IObservableValue observableValue = new PojoValueProperty( propertyDescriptor, null ).observe( realm, named );
但是您会看到上面的代码访问内部类,并且您可能希望复制
PojoObservables.value()
的属性名称拆分代码。您能否澄清您是否确实尝试绑定默认方法,或者您是否假设它不起作用?@Rüdigermann如果您使用PojoObservables.observeValue(object,“name”)
即使在最新的JFace版本中,它也使用默认的Java内省器。因此它不可能工作。我可以成功地绑定PojoProperties.value(Pojo.class,“defaultMethod”).observe(dataBindingContext.getValidationRealm(),Pojo)
其中Pojo.class是与set/getDefaultMethod()的接口
-不完全确定与PojoObservables.observeValue()的差异在哪里
谎言。如果这对您来说不是一个可行的解决方案-您是否考虑过替换PojoProperties.value
?这就是observeValue调用结束的地方,并且获得了PropertyDescriptor
。如果运气好的话,您可以使用自己的PropertyDescriptor
派生实现。@Rüdigermann它没有不要使用PojoProperties.value(…).observe(…)
或者使用org.eclipse.core.databinding
1.4.0,这是下载站点甚至为Eclipse4.4.2提供的版本(当然我们没有使用)。也许这就是为什么这对我不起作用的原因:我们有bean,它可能继承接口的方法,也可能不继承接口的方法,所以我们只能绑定bean类。但是还有很多其他框架也不支持这一点,所以我们想我们不得不痛苦地改变bean来覆盖接口方法(呼叫超级)直到每个人都这么做。