加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

使用groovy类别添加动态属性

发布时间:2020-12-14 16:28:23 所属栏目:大数据 来源:网络整理
导读:扩展到 this blog post,我试图使用一个类别来创建一个简单的DSL,用于javax.measure(JSR-275)类(类似于TimeCategory的时间间隔) 但是,我不想为每个可能的可用方法(getMeter,getMilliMeter,getKelvin,getSecond等)添加样板代码.我认为重写getProperty(String)
扩展到 this blog post,我试图使用一个类别来创建一个简单的DSL,用于javax.measure(JSR-275)类(类似于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,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
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读