【发布时间】:2013-02-12 05:42:30
【问题描述】:
在this blog post 上进行扩展,我正在尝试使用一个类别来创建一个简单的 DSL,以便与javax.measure (JSR-275) 类一起使用(类似于 TimeCategory 的时间间隔)
但是,我不想为每个可能的可用方法(getMeter、getMilliMeter、getKelvin、getSecond 等)添加样板代码。我认为覆盖 getProperty(String) 方法会起作用,但是,在直接访问属性时,似乎没有使用类别中定义的 getProperty 方法。
这里有一些简化的代码来演示: 导入 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、mixins 和其他元类操作)是不可行的,我真的宁愿不必为每个可能的单元手动编写getter 和SI 前缀组合。显然还有其他方法可以创建用于测量的 DSL,但我仍然想了解为什么这种方法不起作用。
有人可以解释为什么该类别的getProperty 方法不会覆盖.propertyName 的用法吗?我显然错过了在运行时使用元类解析属性名称的重要内容。
【问题讨论】: