groovy用途

1 篇文章 0 订阅

1.groovy基础知识

参考教程
gradle导包:compile “org.codehaus.groovy:groovy-all:${groovyVersion}”

2.groovy对java的拓展

  1. 动态性
    单纯的java语言是不具有动态性的,groovy恰恰弥补了这一缺憾,有了groovy你可以在程序运行时任意修改代码逻辑,不需要重新发布,groovy的弱类型让你不用再面对各种类型转换问题。
  2. 语法糖
    groovy在语法上兼具java 语言和脚本语言特点,大大简化了语法。

3.使用groovy加强项目的动态性

对java开发者而言,在做项目的时候往往会碰到这类问题:某一部分的功能需要经常做修改或者添加,如果要使用hard code项目就要频繁的进行发布上线,在一个成熟的系统中这种事情显然是不被允许的。那么就要考虑如何才能实现不去进行代码的重新发布项目就能实现系统功能的修改呢?以下列出三种方式:

  1. 把经常需要修改的系统配置写进数据库,在需要修改配置时只要修改数据库参数就行了。
  2. 使用规则引擎,如drools
  3. 使用groovy

如果使用数据库配置的方法,实际上可以说几乎每个系统里多多少少都会有这种实现,这种方式比较适合用于把比较简单的数据字段写进数据库,在代码运行时读取数据库得到配置字段,达到更改运行时行为的目的,这种方式虽然很通用也很常用,但是这种方式只适用于比较简单的配置,当需要变动的地方比较复杂要涉及到逻辑变动的时候这种方式就不再适用了。

使用drools可以包含逻辑,而且性能也很好。但是也有一个问题,就是学习成本。java开发者如果想把自己的代码写进drools,是需要费一点力气才行的,而且还有一个严重的问题就是drools里边的代码无法调试,不管开发还是维护起来都会很头疼。

而groovy好的地方就是,java开发者可以无缝的进行groovy开发,甚至直接将java代码拷贝到groovy就能够运行。groovy支持直接读取String运行,这意味着可以把java代码以字符串的形式写进数据库,然后在运行时动态的读出来执行,数据库里边的代码逻辑可以随便修改,修改之后可以不用发布立即生效。而且同一套代码可以在本地进行debug,在发生异常时和普通的java代码没有区别。

下面是我做测试用的groovy代码,体会一下

  1. groovy类解析

import org.codehaus.groovy.runtime.InvokerHelper
//注意: 与.java结尾的类不同,这个类文件是以.groovy结尾的
class a{
    static void main(String[] args) {
        String scriptStr = "def b(){ println \"I am grovy script b\" }\n" +
                "void c(){println \"I am grovy script c\"}\n" +
                "private d(){println \"I am grovy script d\"}\n" +
                "def e(int param = 1000){println \"I am grovy script e param default value is \"+param}\n" +
                "String f(){return \"return from method\"}"
        GroovyClassLoader classLoader = new GroovyClassLoader()
        Class<?> ruleClazz = classLoader.parseClass(scriptStr)
        Script script = InvokerHelper.createScript(ruleClazz, new Binding())
        println scriptStr
        println()
        script.invokeMethod("b",null)
        script.invokeMethod("c",null)
        script.invokeMethod("d",null)
        script.invokeMethod("e",null)
        println script.invokeMethod("f",null)
    }
}

运行结果:

def b(){ println "I am grovy script b" }
void c(){println "I am grovy script c"}
private d(){println "I am grovy script d"}
def e(int param = 1000){println "I am grovy script e param default value is "+param}
String f(){return "return from method"}

I am grovy script b
I am grovy script c
I am grovy script d
I am grovy script e param default value is 1000
return from method
  1. groovy表达式解析
import org.codehaus.groovy.control.CompilerConfiguration
class a{
    static void main(String[] args) {
        //自定义脚本
        CompilerConfiguration cfg = new CompilerConfiguration()
        cfg.setScriptBaseClass(Script.class.getName())
        def shell = new GroovyShell(cfg)
        def script = shell.parse("print 'value ' + value + ' 为:' \n value>0?'正数':'负数'")
        def binding = new Binding()
        script.setBinding(binding)
        binding.setVariable("value",-1)
        println script.run()
        binding.setVariable("value",3)
        println script.run()
        //内置脚本示例
        println Eval.xyz(1, 2, 3, "x + y * z")//简单的表达式脚本,对GroovyShell的包装
    }
}

结果:

value -1 为:负数
value 3 为:正数
7

String完全可以存入数据库,在运行时读出来再运行(当然考虑到效率问题最好对脚本做缓存)。这样只要修改数据库中的代码就可以动态修改项目的行为了。

  • 12
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Groovy语言中,delegate是一个关键字,用于指定一个对象来执行闭包内部的方法调用。当在闭包内部调用一个方法时,如果该方法没有在闭包中定义,Groovy会自动将该方法调用委托给delegate对象来执行。delegate关键字允许我们在闭包内部使用外部对象的方法,而不需要显式地引用该对象。 使用delegate关键字可以简化代码,并提高代码的可读性和可维护性。通过指定delegate对象,我们可以在闭包中轻松地调用该对象的方法,而无需在闭包内部编写冗长的调用代码。这使得代码更加简洁,同时也减少了代码中的重复性。 在实际使用中,delegate关键字的用法非常灵活。可以根据实际需求来决定委托给哪个对象执行方法调用。这样,我们可以根据具体情况选择不同的delegate对象,以实现不同的功能。 在Groovy中,还有其他一些相关的关键字,比如this、owner等。this关键字指的是当前闭包的实例,而owner关键字指的是持有当前闭包的对象。这些关键字与delegate关键字一起使用,可以更好地控制闭包的执行行为。 总之,delegate关键字在Groovy语言中起到了简化代码、提高可读性和可维护性的作用。通过委托给指定的对象执行方法调用,我们可以轻松地在闭包内部使用外部对象的方法,从而实现更加灵活和高效的编程。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [Groovy探索之delegate关键字 一(1)](https://blog.csdn.net/hivon/article/details/3156040)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [groovy中的特殊注解1](https://download.csdn.net/download/weixin_35798040/86344467)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值