groovy运行期间动态添加属性和方法

我们都知道,在Groovy语言中,我们可以使用MOP特性在运行期内动态添加属性或方法?/span>

 

这种添加包括两个层面的添加:

第一:是给一个类添加属性或方法。也就是说,如果我们在运行期内给一个类添加了属性或方法,那么添加了以后,所有这个类实例化的对象,都将拥有了这个属性或方法?span class="Apple-converted-space"> 
第二,是给一个对象添加属性或方法。也就是说,如果我们在运行期内给一个对象添加了属性或方法,那么添加了以后,只有这个对象才拥有这个属性或方法。换句话说,如果我们再给这个对象的类实例化一个对象,那么该对象则不能拥有我们刚添加的那个属性或方法?span class="Apple-converted-space"> 
真的是这样吗?让我们举几个例子来看看吧?/span>

使用ExpondoMetaClass在运行期内给一个类添加属性或方法是我们最最常用的一种在运行期内添加属性或方法的方法。比如,我们有如下的一个类?/span>

 

class Testor1 {

 

}

现在,我们就尝试着使用ExpondoMetaClass在运行期内给Testor1添加一个方法,然后来测试它?/span>

 

     

      def t = new Testor1()

     

      try

      {

         println 't invoke far'

         t.far()

      }

      catch(Exception e)

      {

        

      }

 

      Testor1.metaClass."far" = {

             ->

               println 'far'

      }

     

      def t1 = new Testor1()

     

      println 't1 invoke far'

      t1.far()

     

     

      def t2 = new Testor1()

     

      println 't2 invoke far'

      t2.far()

 

测试很简单,我们在添加方法之前实例化一个Testor1对象,然后再添加方法之后实例化两个Testor1对象,分别来测试它们?/span>

结果为:

t invoke far

t1 invoke far

far

t2 invoke far

far

从结果可以看出:在添加方法之前实例化的那个对象不能调?far"方法,而添加方法之后实例化的两个对象都可以调用"far"方法?/span>

这就是在运行期内给类添加方法或属性的结果?/span>

其实,使用MOP特性在运行期内给类添加属性或方法还有一种方法来实现,它就是下面的这种方法:

 

      def t = new Testor1()

     

      try

      {

         println 't invoke far'

         t.far()

      }

      catch(Exception e)

      {

        

      }

 

      def mc = new ExpandoMetaClass(Testor1.class,true)

     

      mc.far = {

       ->

           println 'far'

      }

     

      mc.initialize()

     

      def t1 = new Testor1()

     

      println 't1 invoke far'

      t1.far()

     

     

      def t2 = new Testor1()

     

      println 't2 invoke far'

      t2.far()

     

   

  }

就是使用ExpondoMetaClass类来实例化一个对象,?def mc = new ExpandoMetaClass(Testor1.class,true)",再给该对象添加一个方法,如:

 

      mc.far = {

       ->

           println 'far'

      }

     

然后,将这个对象实例化,?mc.initialize()"?/span>

上面代码的运行结果为?/span>

t invoke far

t1 invoke far

far

t2 invoke far

far

跟一种方法的结果一样?/span>

最后,我们来看看如何给一个对象在运行期内添加属性或方法,以及它们的运行结果?/span>

 

      def t = new Testor1()

     

      try

      {

         println 't invoke far'

         t.far()

      }

      catch(Exception e)

      {

        

      }

     

      def t1 = new Testor1()

     

      def emc = new ExpandoMetaClass( Testor1.class, false )

      emc.far = { println "far" }

      emc.initialize()

      t1.metaClass = emc

 

     

      println 't1 invoke far'

      t1.far()

     

     

      def t2 = new Testor1()

     

      try

      {

        println 't2 invoke far'

        t2.far()

      }

      catch(Exception e)

      {

        

      }

 

我们还使?def emc = new ExpandoMetaClass( Testor1.class, false )"语句来给一个对象添加属性或方法,但需要记住的是,第二个参数是"false"。接着,我们就可以添加方法了:

emc.far = { println "far" }

最后,还要做两件事,就是实例化该对象,并且把该对象赋值给t1对象的metaClass属性。如?/span>

emc.initialize()

t1.metaClass = emc

上面代码的运行结果为?/span>

t invoke far

t1 invoke far

far

t2 invoke far

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在 Jenkins 构建期间动态添加 Android 项目依赖项,需要使用 Jenkins Pipeline 的 `Jenkinsfile` 文件来定义构建流程并添加依赖项。以下是一个示例: ```groovy pipeline { agent any stages { stage('Build') { steps { // 清除构建缓存 sh './gradlew clean' // 定义空的依赖项列表 def dynamicDeps = [] // 添加依赖项解析监听器 script { currentBuild.addListener(new DependencyResolutionListener() { void beforeResolve(ResolvableDependencies resolvableDependencies) { // 添加需要的依赖项 dynamicDeps.add('group:name:version') } void afterResolve(ResolvableDependencies resolvableDependencies) { // 移除监听器,避免重复添加依赖项 currentBuild.removeListener(this) // 添加依赖项 sh "./gradlew app:dependencies --configuration compileOnly | grep -B 1 'compileOnly' | grep -v 'compileOnly' | awk '{print $1 \"@\" $2}' | xargs -n 1 ./gradlew app:dependencies --configuration compileOnly --add-modules" } }) } // 构建项目 sh './gradlew assembleDebug' } } } } ``` 在这个例子中,我们首先定义了一个空的依赖项列表`dynamicDeps`,然后添加了一个依赖项解析监听器,以在依赖项解析过程中动态添加所需的依赖项。在监听器的`afterResolve`方法中,我们移除了该监听器,并使用`grep`、`awk`和`xargs`命令来从项目的`compileOnly`依赖项中提取所有依赖项,并将其添加到项目中。最后,我们使用`./gradlew assembleDebug`命令来构建项目。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值