在这篇博客文章的基础上,我正在尝试使用类别为javax.measure
(JSR-275)类创建一个简单的DSL(与TimeCategory用于时间间隔类似)
然而,我不想为每个可能可用的方法(getMeter、getMilliMeter、getKelvin、getSecond等)添加样板代码。我认为覆盖getProperty(String)
方法会起作用,但遗憾的是,在直接访问属性时,类别中定义的getProperty
方法未被使用。
这里是一些简化的代码来说明: import javax.measure.quantity.Length; import javax.measure.unit.Unit; import javax.measure.Measure;
@Category(Number)
class LengthCategory {
public Measure<BigDecimal, Length> getProperty(String unit){
return Measure.valueOf(this,Unit.valueOf(unit));
}
}
use(LengthCategory){
println 3.getProperty("m") // this works
println 3.m // this reports a non-exisiting property
prinlln 3.'m' // as does this
}
假设其他动态添加属性到运行时对象的方法(例如Expando、子类化GroovyInterceptible、混合和其他元类操作)不可行,我真的不想手动编写每个可能的单位和SI前缀组合的getter。显然,创建测量DSL的其他方法,但我仍然希望了解为什么这种方法不起作用。
有人能解释一下为什么类别的getProperty方法没有覆盖.propertyName使用吗?在运行时期间使用元类解析属性名称时,我显然漏掉了一些重要内容。