Groovy复制/合并来自多个对象的元方法

解决J

我有两节课。在运行时,我想将一个对象的方法“克隆”到另一个对象。这可能吗?我使用左移的失败尝试如下所示。

(注意:我也尝试了currMethod.clone(),结果相同。)

class SandboxMetaMethod2 {
    String speak(){
        println 'bow wow'
    }
}

class SandboxMetaMethod1{

  void leftShift(Object sandbox2){
      sandbox2.metaClass.getMethods().each{currMethod->
          if(currMethod.name.contains("speak")){
              this.speak()
              this.metaClass."$currMethod.name" = currMethod
              this.speak()
          }
      }
  }

  String speak(){
    println 'woof'
  }
}

class SandboxMetaMethodSpec extends Specification {
    def "try this"(){
        when:
        def sandbox1 = new SandboxMetaMethod1()
        def sandbox2 = new SandboxMetaMethod2()
        sandbox1 << sandbox2


        then:
        true
    }

}


//Output
woof
speak
woof

根据请求,我要为目标/用例添加背景:

这非常类似于用例的标准功能类型。总而言之,我们在一个适用于所有客户端环境(50-100)的类上有很多方法。我们将其应用于按特定默认顺序处理数据。那些特定于客户的方法(如果它们以相同的方法名称存在)可能会覆盖这些方法中的每一个,其想法是使用上述方法“协调”方法集。根据客户端环境名称,我们需要一种动态覆盖方法的方法。

注意:元类上的重写方法是非常标准的(或者我应该说,这是惊人功能存在的原因)。如果我的方法以String currMethod =“ {x-> x + 1}”之类的文本形式存在,那么它就起作用了,那么我只说this.metaClass。“ $ currMethodName” = currMethod。在这种情况下,我面临的挑战是我的方法已编译并存在于另一个类中,而不是在某处定义为文本。

在构建时将所有自定义方法编译在特定于客户端的类中的目的是避免在运行时为每次计算而编译这些动态方法的开销,因此所有特定于客户端的方法都将在以下位置编译为单独的特定于客户端的JAR:建立时间。这种方式还允许我们仅将特定于客户端的代码部署到相应的客户端,而无需在某个主类中进行所有其他客户端的计算。

我希望这是有道理的。

针对Jeremie B的建议的新方法:

由于我需要选择要在运行时通过名称实现的特征,因此将执行以下工作:

String clientName = "client1"
String clientSpeakTrait = "${clientName}Speak"

trait globalSpeak {
    String speak() {
        println 'bow wow'
    }
}

trait client1Speak {
    String speak() {
        println 'woof'
    }
}

def mySpeaker = new Object().withTraits globalSpeak, clientSpeakTrait
耶利米B

特征的基本示例:

trait Speak {
    String speak() {
        println 'bow wow'
    }
}

class MyClass {

}

def instance = new MyClass()
def extended = instance.withTraits Speak

extended.speak()

您可以选择在运行时使用哪个特征:

def clientTrait = Speak
def sb = new Object().withTraits(clientTrait)

sb.speak()

并使用ClassLoader动态加载特征:

def clientTrait = this.class.classLoader.loadClass "my.package.${client}Speak"
def sb = new Object().withTraits(clientTrait)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Groovy复制/合并来自多个对象的元方法

来自分类Dev

合并来自多个来源的元数据

来自分类Dev

Excel - 合并来自多个表的数据

来自分类Dev

解析来自多个Json对象的数据

来自分类Dev

如何合并和显示来自多个表的数据

来自分类Dev

XSLT:收集并合并来自多个文件的信息

来自分类Dev

如何使用重复键合并来自多个词典的数据?

来自分类Dev

如何使用jq合并来自多个文件的JSON记录

来自分类Dev

在MySQL中合并来自多个表的多行

来自分类Dev

组合来自多个RxJS可观察对象的数据的更好方法

来自分类Dev

来自多个来源的jQuery动画-影响多个对象

来自分类Dev

使用来自多个indexeddb对象库的数据

来自分类Dev

链接和拆分来自多个模型的对象的QuerySet

来自分类Dev

根据布尔值保存来自多个对象的文本

来自分类Dev

用来自多个 mysql 查询的数据填充对象数组

来自分类Dev

如何在Python中合并来自多个文件夹的多个CSV文件?

来自分类Dev

WordPress:多个搜索词或来自多个WP_Queries的合并结果

来自分类Dev

来自多个线程的cudaEventSynchronize

来自分类Dev

来自多个列表的Countif

来自分类Dev

来自多个列表的UNION

来自分类Dev

来自多个管道的输入

来自分类Dev

来自多个模式的 DWH

来自分类Dev

来自多个 Foreach 的 Linq

来自分类Dev

来自多个表的求和?

来自分类Dev

来自多个表的图表

来自分类Dev

来自多个数据框列的值合并为一个向量

来自分类Dev

来自多个临时表的数据将合并到一个临时表中

来自分类Dev

合并器是否可以处理来自多个映射器的结果?

来自分类Dev

获得平均系数和调整 使用lapply来自多个合并回归的R ^ 2

Related 相关文章

热门标签

归档