扩展这篇博文,我试图使用一个类别来创建一个简单的 DSL 以用于javax.measure
(JSR-275)类(类似于时间间隔的 TimeCategory)
但是,我不想为每个可能的可用方法(getMeter、getMilliMeter、getKelvin、getSecond 等)添加样板代码。我认为覆盖该getProperty(String)
方法会起作用,但是,在直接访问该属性时,似乎getProperty
没有使用该类别中定义的方法。
下面是一些简化的代码来演示: import javax.measure.quantity.Length; 导入 javax.measure.unit.Unit;导入 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
使用情况吗?我显然错过了在运行时使用元类解析属性名称的重要内容。