分类分类
大小:82.65 MB 更新:2020/12/10
类别:编程工具系统:WinXP, Win7, Win8, Win10, WinAll
Apache Groovy是一款功能强大的可选类型化和动态语言,具有Java平台的静态类型和静态编译功能,旨在通过简洁,熟悉且易于学习的语法提高开发人员的工作效率;它可以与任何Java程序顺利集成,并立即为您的应用程序提供强大的功能,包括脚本编写功能,特定领域语言编写,运行时以及编译时元编程和函数式编程;Groovy带有集成支持,可在Groovy对象和JSON之间进行转换,groovy.json包中提供了专用于JSON序列化和解析的类;支持解析器变体,JsonSlurper带有一些解析器实现,每个解析器都适合不同的要求,很可能在某些情况下,JsonSlurper默认解析器并不是在所有情况下的最佳选择,这是附带的解析器实现的概述,该JsonParserCharArray分析器基本上采用JSON字符串和底层字符阵列上操作,在值转换期间,它会复制字符子数组并对其进行操作;Groovy的groovy-sql模块提供了Java JDBC技术之上的更高层次的抽象,JDBC本身提供了一个较低层但相当全面的API,该API提供对各种受支持的关系数据库系统的统一访问;在这里的示例中,系统将使用HSQLDB,用户也可以使用Oracle,SQL Server,MySQL和其他主机;groovy-sql模块中最常用的类是groovy.sql.Sql将JDBC抽象提升一级的类!
学习曲线平坦
简洁,易读且富有表现力的语法,Java开发人员易于学习
流畅的Java集成
无缝和透明地集成Java和任何第三方库并与之互操作
充满活力的生态系统
Web开发,反应性应用程序,并发/异步/并行性库,测试框架,构建工具,代码分析,GUI构建强大的功能
闭包,构建器,运行时和编译时元编程,功能编程,类型推断和静态编译
领域特定语言
灵活可延展的语法,高级集成和自定义机制,可在您的应用程序中集成可读的业务规则
脚本和测试胶
非常适合编写简洁且可维护的测试,以及所有构建和自动化任务
SC:子类对包私有或私有字段的访问未指示为错误
不存在的类的Groovsh导入将引发空指针而不是语法错误
将具有类型参数的特征实现为原始类型时为NPE
如果类型引用使用方法引用,则解析了错误的类型方法
在groovyc 3.0和4.0中回归,并在特征中使用通用静态方法编译静态
STC:UnionTypeClassNode是为简单的instanceof场景创建的
Groovy 3生成的lambda类被标记为合成
STC:从Closure到外部类私有字段的putAt快捷方式符号导致GroovyCastException
AnnotationCollectorTransform生成未标有@Generated的代码
静态上下文中与可调用属性不一致
避免潜在的NPE在antlr2 groovysh
SC:在条件块中分配的变量的强制转换异常
lambda参数类型错误时引发的Bootstrap方法初始化异常
SC:跨包保护的字段访问使用动态属性方法
使用方法引用会导致编译器错误,方法参考不接受参数的子类型
对象未与Groovy绑定(但在Java中工作正常)
@AutoImplement不考虑声明的属性,JSP API许可证似乎丢失
STC:CollType <的传播安全和列表属性访问错误<?扩展了ItemType>
STC中的StackOverflowError,用较新的可用变体替换一些旧的api用法
在某些情况下丢失了超级接口的接口常量
更好地传播了InterruptedException
静态内部类的静态内部类缺少内部类表属性
1.默认导入
默认情况下,所有这些包和类都是导入的,即,您不必使用显式import语句来使用它们:
java.io. *
java.lang。*
java.math.BigDecimal
java.math.BigInteger
java.net。*
java.util。*
groovy.lang。*
groovy.util。*
2.多种方法
在Groovy中,将在运行时选择要调用的方法。这称为运行时调度或多方法。这意味着将在运行时根据参数的类型选择方法。在Java中,情况恰恰相反:方法是在编译时根据声明的类型选择的。
以下用Java代码编写的代码可以用Java和Groovy进行编译,但是它们的行为有所不同
而在Groovy中:
assertEquals(1, result);
这是因为Java将使用静态信息类型,该信息类型o被声明为Object,而Groovy将在运行时实际调用该方法时进行选择。由于它是带一个String,那么 String版本被调用。
3.数组初始化器
在Java中,数组初始化器采用以下两种形式之一:
int[] array = {1, 2, 3}; // Java array initializer shorthand syntax
int[] array2 = new int[] {4, 5, 6}; // Java array initializer long syntax
在Groovy中,该{ … }块保留用于闭包。这意味着您无法使用Java的数组初始化器简写语法创建数组文字。您改为借用Groovy的文字列表表示法,如下所示:
int[] array = [1, 2, 3]
对于Groovy 3+,可以选择使用Java的数组初始化程序长语法:
def array2 = new int[] {1, 2, 3} // Groovy 3.0+ supports the Java-style array initialization long syntax
4.包范围可见性
在Groovy中,在字段上省略修饰符不会像Java中那样导致程序包专用字段
Groovy 3+支持此类块。但是,Groovy提供了各种依赖于闭包的方法,这些方法具有相同的效果,但更加惯用
6.内部班级
匿名内部类和嵌套类的实现紧随Java,但是有一些区别,例如,从此类中访问的局部变量不必是最终的。我们groovy.lang.Closure 在生成内部类字节码时会使用一些实现细节。
静态内部类的使用是最受支持的一种。如果您绝对需要一个内部类,则应使其成为静态类。
但是请注意,Groovy支持使用一个参数调用方法而不给出参数。该参数的值将为null。基本上,相同的规则适用于调用构造函数。例如,存在编写新X()而不是新X(this)的危险。由于这也可能是常规方法,因此我们尚未找到防止此问题的好方法。
Groovy 3.0.0支持Java样式语法来创建非静态内部类的实例。
7. Lambda表达式和方法引用运算符
Java 8+支持lambda表达式和方法引用运算符(::):
Runnable run = () -> System.out.println("Run"); // Java
list.forEach(System.out::println);
Groovy 3及更高版本在Parrot解析器中也支持这些功能。在Groovy的早期版本中,应改为使用闭包:
Runnable run = { println 'run' }
list.each { println it } // or list.each(this.&println)
8. GStrings
由于将双引号字符串文字解释为GString值,因此如果String使用Groovy和Java编译器编译文字文字包含美元字符的类,则Groovy可能会因编译错误而失败或产生微妙的不同代码。
虽然通常情况下,Groovy的之间会自动施放GString和String如果API声明参数的类型,提防接受的Java API的Object参数,然后检查实际的类型。
9.字符串和字符文字
在Groovy单引号的文字被用于String和双引号的结果 String还是GString取决于是否有字面插值。
assert 'c'.getClass()==String
assert "c".getClass()==String
assert "c${1}".getClass() in GString
Groovy仅在分配给type变量时才会自动将单个字符String转换char为char。当使用类型为实参的方法调用方法时,char我们需要显式转换或确保值已预先转换。
Groovy支持两种类型的转换,在char转换多个字符字符串时,在转换的情况下存在细微的差异。Groovy样式的转换更为宽大,将采用第一个字符,而C样式的转换将异常失败。
10.基元和包装
因为Groovy对所有对象都使用对象,所以它会自动包装对基元的引用。因此,它不遵循Java的扩展行为,即优先于装箱。
这是Java会调用的方法,因为扩展优先于拆箱。
这是Groovy实际调用的方法,因为所有原始引用都使用其包装器类。
11.行为 ==
用Java==表示对象的原始类型或身份相等。在Groovy中,==在所有情况下都意味着平等。a.compareTo(b) == 0当评估Comparable对象的相等性时,它将转换为,a.equals(b)否则转换为。要检查身份(引用相等),请使用is方法:a.is(b)。在Groovy 3中,还可以使用===运算符(或否定的版本):(a === b或c !== d)。
12.转换
Java会自动进行扩大和缩小 转换。
* 'Y'表示Java可以进行的转换,'C'表示在进行显式转换时Java可以进行的转换,'T'表示Java可以进行的转换但数据被截断,'N'表示Java可以进行的转换。做。
Groovy对此进行了很大的扩展。
* 'Y'表示Groovy可以进行的转换,'D'表示Groovy在动态或显式编译时可以进行的转换,'T'表示Groovy可以进行的转换但数据被截断,'B'表示装箱/拆箱操作,“ N”表示Groovy无法进行的转换。
转换为/时,截断使用Groovy Truth。从数字转换为字符会将转换为。从a或or转换时, 使用Groovy构造和using ,否则使用构造。其他转换的行为由定义。booleanBooleanNumber.intvalue()charBigIntegerBigDecimalNumber.doubleValue()FloatDoubletoString()java.lang.Number
读取文件
作为第一个示例,让我们看看如何在Groovy中打印文本文件的所有行:
new File(baseDir, 'haiku.txt').eachLine { line ->
println line
该eachLine方法是FileGroovy自动添加到类的方法,并且具有许多变体,例如,如果您需要知道行号,则可以使用此变体:
new File(baseDir, 'haiku.txt').eachLine { line, nb ->
println "Line $nb: $line"
如果出于任何原因在eachLine主体中引发异常,则该方法将确保正确关闭资源。对于Groovy添加的所有I / O资源方法,都是如此。
例如,在某些情况下,您将更喜欢使用Reader,但是仍然可以从Groovy的自动资源管理中受益。在下一个示例中,即使发生异常,阅读器也会关闭:
def count = 0, MAXSIZE = 3
new File(baseDir,"haiku.txt").withReader { reader ->
while (reader.readLine()) {
if (++count > MAXSIZE) {
throw new RuntimeException('Haiku should only have 3 verses')
如果需要将文本文件的行收集到列表中,可以执行以下操作:
def list = new File(baseDir, 'haiku.txt').collect {it}
或者,您甚至可以利用as运算符将文件的内容分成几行:
def array = new File(baseDir, 'haiku.txt') as String[]
您必须将文件的内容放入byte[]多少次,并且需要多少代码?Groovy实际上非常容易:
byte[] contents = file.bytes
使用I / O不仅限于处理文件。实际上,很多操作都依赖于输入/输出流,因此,为什么Groovy为此添加了许多支持方法,如您在文档中所看到的 。
举个例子,你可以获取InputStream从File非常容易:
def is = new File(baseDir,'haiku.txt').newInputStream()
// do something ...
is.close()
但是,您可以看到它需要您关闭输入流。在Groovy中,通常最好使用withInputStream惯用语为您解决:
new File(baseDir,'haiku.txt').withInputStream { stream ->
// do something ...
写文件
当然,在某些情况下,您将不希望读取而是写入文件。选项之一是使用Writer:
new File(baseDir,'haiku.txt').withWriter('utf-8') { writer ->
writer.writeLine 'Into the ancient pond'
writer.writeLine 'A frog jumps'
writer.writeLine 'Water’s sound!'
但是对于这样一个简单的示例,使用<<运算符就足够了:
new File(baseDir,'haiku.txt') << '''Into the ancient pond
A frog jumps
Water’s sound!'''
当然,我们并不总是处理文本内容,因此您可以使用Writer或直接写字节,如以下示例所示:
file.bytes = [66,22,11]
当然,您也可以直接处理输出流。例如,这是创建输出流以写入文件的方式:
def os = new File(baseDir,'data.bin').newOutputStream()
// do something ...
os.close()
但是,您可以看到它需要您关闭输出流。同样,总的来说,使用withOutputStream惯用法来处理异常并在任何情况下关闭流都是一个更好的主意:
new File(baseDir,'data.bin').withOutputStream { stream ->
// do something ...
运行时和编译时元编程
Groovy语言支持两种元编程形式:运行时和编译时。第一个允许在运行时更改类模型和程序的行为,而第二个仅在编译时发生。两者都有优点和缺点,我们将在本节中详细介绍。
1.运行时元编程
通过运行时元编程,我们可以将拦截,注入甚至综合类和接口方法的决策推迟到运行时。为了深入了解Groovy的元对象协议(MOP),我们需要了解Groovy对象和Groovy的方法处理。在Groovy中,我们处理三种对象:POJO,POGO和Groovy拦截器。Groovy允许以各种方式对所有类型的对象进行元编程。
POJO-常规Java对象,其类可以用Java或JVM的任何其他语言编写。
POGO-一个Groovy对象,其类用Groovy编写。默认情况下,它扩展java.lang.Object并实现了groovy.lang.GroovyObject接口。
Groovy拦截器-一个Groovy对象,该对象实现groovy.lang.GroovyInterceptable接口并具有方法拦截功能,将在GroovyInterceptable部分中进行讨论。
对于每个方法调用,Groovy都会检查对象是POJO还是POGO。对于POJO,GroovyMetaClass从groovy.lang.MetaClassRegistry中获取它,并将方法调用委托给它。对于POGO,Groovy采取了更多步骤,
Embarcadero RAD Studio(多功能应用程序开发工具) 编程工具177.22 MB12
详情猿编程客户端 编程工具173.32 MB4.16.0
详情猿编程 编程工具173.32 MB4.16.0
详情VSCodium(VScode二进制版本) 编程工具76.23 MBv1.57.1
详情aardio(桌面软件快速开发) 编程工具9.72 MBv35.69.2
详情一鹤快手(AAuto Studio) 编程工具9.72 MBv35.69.2
详情ILSpy(.Net反编译) 编程工具3.97 MBv8.0.0.7339 绿色
详情文本编辑器 Notepad++ 编程工具7.81 MBv8.1.3 官方中文版
详情核桃编程 编程工具272.43 MBv2.1.120.0 官方版
详情delphi2007完整 编程工具1198 MB附安装教程
详情SAPIEN PrimalScript2015 编程工具78.02 MB附带安装教程
详情Alchemy Catalyst可视化汉化工具 编程工具81.00 MBv13.1.240
详情Professional Tag Editor(通用标签编辑器) 编程工具25.6 MBv1.0.6.8
详情Coffeecup HTML Editor(html网页编辑器) 编程工具68.98 MBv15.4 特别版
详情JCreator Pro 编程工具9.65 MBv5.0.1 汉化
详情WebStorm 12中文 编程工具209.88 MB附带安装教程
详情MSWLogo(多功能项目开发与管理工具) 编程工具2.25 MBv6.5 免费版
详情JetBrains datagrip 2018.2.1中文-datagrip 2018.2.1 编程工具160.88 MB附注册码汉化包
详情易安卓5.0 编程工具202 MBv5.0 附破解补丁
详情keil uvision5 编程工具271.63 MB附带安装教程
详情CIMCO Edit V8中文 编程工具248 MB附安装教程
详情IntelliJ IDEA 2020.1(java集成开发环境) 编程工具643.0 MB附安装教程
详情redis desktop manager2020.1中文 编程工具32.52 MB附带安装教程
详情猿编程 编程工具173.32 MB4.16.0
详情信捷PLC编程工具软件 编程工具14.4 MBv3.5.2 官方版
详情源码编辑器 编程工具201.0 MBv3.4.3 官方版
详情Microsoft Visual C++ 编程工具226.00 MBv6.0 SP6 简体中文版
详情s7 200 smart编程软件 编程工具187 MBv2.2 官方中文版
详情TouchWin编辑工具(信捷触摸屏编程软件) 编程工具55.69 MBv2.D2c 官方版
详情易语言5.8完美 编程工具312 MB5.8.1 破解增强版
详情Scraino(少儿编程软件) 编程工具272.93 MBv0.3.0 官方版
详情vs2008中文 编程工具1495 MB附序列号
详情e盾网络验证源码 编程工具25.77 MBV45 官方版
详情codeblocks 编程工具95.21 MBv13.12 中文完整版(带GNW编译器
详情Android Studio(安卓开发环境) 编程工具983.0 MBv3.5.0.21 汉化版(附安装教程)
详情源码编辑器pc版 编程工具201.0 MBv3.4.3 官方版
详情CH341A编程器 编程工具1.06 MB1.30 绿色中文版
详情layuiAdmin pro(layui后台管理模板系统) 编程工具0.57 MBv1.1.0 单页版
详情海龟编辑器 编程工具71.5 MBv0.8.4 中文版
详情Ardublock中文版(Arduino图形化编程软件) 编程工具2.65 MB附带安装教程
详情文本编辑器 Notepad++ 编程工具7.81 MBv8.1.3 官方中文版
详情富途牛牛 编程工具160.59 MBv11.8.9068 官方版
详情微信开发者工具 编程工具129.37 MBv1.05.2105170 官方版
详情UEStudio v18.0.0.18 简体中文绿色 编程工具19.00 MB
详情十六进制编辑器 WinHex 编程工具2.79 MBv20.2 SR-5
详情代码编辑器 Sublime Text 编程工具54.74 MBv4.0.0.4126
详情RJ TextEd(代码编辑器) 编程工具49.46 MBv15.31
详情核桃编程 编程工具272.43 MBv2.1.120.0 官方版
详情影刀 编程工具306.37 MBv4.9.14
详情Kate(高级文本编辑器) 编程工具56.11 MBv21.12.1.1544
详情