使用groovy类别添加动态属性
扩展到
this blog post,我试图使用一个类别来创建一个简单的DSL,用于javax.measure(JSR-275)类(类似于TimeCategory的时间间隔)
但是,我不想为每个可能的可用方法(getMeter,getMilliMeter,getKelvin,getSecond等)添加样板代码.我认为重写getProperty(String)方法会起作用,但是,看起来直接访问属性时不会使用类别中定义的getProperty方法. 这是一些简化的代码来演示: @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和其他元类操作)是不可行的,我真的不必为每个可能的单元和SI前缀组合手动编写getter.显然还有其他方法可以为测量创建DSL,但我仍然想了解为什么这种方法不起作用. 有人可以解释为什么类别的getProperty方法不会覆盖.propertyName用法吗?我显然遗漏了在运行时使用元类解析属性名称的重要事项. 解决方法
我不知道为什么getProperty不适用于类别.但你可以在它们上定义一个基本相同的get方法(我认为).这有效:
@Category(Number) class LengthCategory { def get(String unit) { "$this $unit" } } use (LengthCategory) { println 3.m // 3 m println 3.'m' // 3 m } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |