Groovy学习笔记-2.Groovy相关基础信息

news/2024/10/18 5:52:26/

更多代码相关的内容可以参考:https://github.com/zclhit/groovy_learning/tree/main

代码结构

注释

#!注释,只允许出现在groovy脚本的第一行,通过这种注释可以方便Unix shell进行定位启动并运行
//单行注释
/* xxxxx */多行注释
/** xxxxx */doc风格的注释,可以使用groovydoc生成注释文档

自动导入类

groovy会自动导入:

import groovy.lang.*
import groovy.util.*
import java.lang.*
import java.util.*
import java.net.*
import java.io.*
import java.math.BigInteger
import java.math.BigDecimal

而java只会自动导入:

import java.lang.*;

断言

assert (true)
assert 1==1
def x=1
assert x==1
def y=1; assert y==1

1.断言可以显示当前程序的运行状态
2.断言可以替换注释语句,用来表示结果符合自己的期望

开始写程序

定义类

class Book {private String titleBook (String theTitle) {title = theTitle}String getTitle() {return title}
}

和Java类很像

使用类

Book gina = new Book('Groovy in Action')
assert gina.title == 'Groovy in Action'
assert getTitleBackwards(gina) == 'noitcA ni yvoorG'String getTitleBackwards(book) {title = book.getTitle()return title.reverse()
}

定义Beans

groovyBean可以:

  1. 自动生成访问方法
  2. JavaBeans简化访问方式
  3. 事情处理器简化使用方式
class BookBean {String title //属性
}def groovyBook = new BookBean()//通过显示的方法调用来使用属性
groovyBook.setTitle('Groovy conquers the world')
assert groovyBook.getTitle() == 'Groovy conquers the world'//通过groovy的快捷方式来使用属性
groovyBook.title = 'Groovy in Action'
assert groovyBook.title == 'Groovy in Action'

文本处理

GStrings变量替换

def nick = 'Gina'
def book = 'Groovy in Action'
assert "$nick is $book" == 'Gina is Groovy in Action'

数字对象

Groovy中的数字是类对象,而不是专有的类型

def x = 1
def y = 2
assert x + y == 3
assert x.plus(y) == 3
assert x instanceof Integer

groovy中的集合

1.Lists

//罗马数字列表
def roman = ['', 'I', 'II', 'III', 'IV', 'V', 'VI', 'VII']
//访问列表
assert roman[4] == 'IV'
//扩张列表
roman[8] = 'VIII'
assert roman.size() == 9

2.映射maps

map通过k-v形式取值,lists根据位置取值。

def http = [
100 : 'CONTINUE', 
200 : 'OK',
400 : 'BAD REQUEST' ]
assert http[200] == 'OK'
http[500] = 'INTERNAL SERVER ERROR' 
assert http.size() == 4

3.范围ranges

设置开始的点和结束点,生成一个range,并且可以随时进行倒转的操作

def x = 1..10
assert x.contains(5)
assert !x.contains(15)
assert x.size() == 10
assert x.from == 1
assert x.to == 10
assert x.reverse() == 10..1

4.代码块:闭包

闭包是groovy中非常常见但是在java中类似于函数式编程的东西。

一个闭包就是一个花括号围起来的语句块,闭包有一个可选的参数列表,通过->进行参数传递

例如[1,2,3].each{ entry -> println entry}就行一个典型的闭包形式

5.结构控制语句

//在一行的if语句
if (false) assert false//null表示 false
if (null) {assert false
} else {assert true
}//典型的while
def i = 0
while (i < 10) {i++
}
assert i == 10//迭代一个range
def clinks = 0
for (remainingGuests in 0..9) {clinks += remainingGuests
}
assert clinks == (10 * 9) / 2//迭代一个列表
def list = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
for (j in list) {assert j == list[j]
}//以闭包为参数的each方法
list.each() { item ->assert item == list[item]
}//典型的switch
switch (3) {case 1: assert false; breakcase 3: assert true; breakdefault: assert false
}

在Java环境中运行groovy

groovy代码和java代码都是运行在jvm中,有两种运行方式:

  1. groovyc编译*.groovy代码,生成java的*.class文件,并将这些class文件放置到java类路径中,使用java类加载器进行加载

  2. 通过groovy类加载器直接加载groovy代码,不会生成*.class,但是会生成java.lang.Class对象实例。

groovy在源代码级别增强了java,但是在字节码上和java又是一样的。

GDK:Groovy类库

groovy类库是jdk的扩展,增加了一些新的类,并提供了java类所不具备的新的功能。比如GDK中的size方法,就可以作用于不同的对象并产生不同的结果。

Groovy允许为对象分配动态的方法,这个就是用MetaClass进行控制的

groovy的生命周期

java是如何在运行时理解.groovy文件的呢?

groovy的代码并不是一行一行被转换的,而是整个文件被完整的转化为java可以执行的类。

groovy的类加载器可以直接从*.groovy的文件中加载类,在放入jvm缓存之前就已经完成了转换和生成的相关工作。

groovy的动态特性

groovy是在编译后就确定的语言,那么动态特性是如何实现的呢?

因为groovy的方法调用是通过:
getMetaClass().invokeMethod(this, "foo", EMPTY_PARAM_ARRAY)的方式进行调用的,那么就相当于是交给了对象的MetaClass进行处理

这个MetaClass就可以在运行时进行拦截、重定向、增加删除方法等操作行为

另一种动态代码的方式是将要执行的动态代码放置在字符串中

def code= '1+'
code += System.getProperty('os.version')println codeprintln evaluate(code)

http://www.ppmy.cn/news/103995.html

相关文章

基于复旦微FMQL45T900 全国产ARM+FPGA核心板方案

XM745D 是一款基于上海复旦微电子 FMQL45T900 的全国产化 ARM 核心板。该核心板将复旦微的 FMQL45T900&#xff08;与 XILINX 的 XC7Z045-2FFG900I 兼容&#xff09;的最小系统集成在了一个 87*117mm 的 核心板上&#xff0c;可以作为一个核心模块&#xff0c;进行功能性扩展&a…

Netty实战(九)

单元测试 一、什么是单元测试二、EmbeddedChannel 概述三、 使用 EmbeddedChannel 测试 ChannelHandler3.1 测试入站消息3.2 测试出站消息 一、什么是单元测试 单元测试的基本思想是&#xff1a;以尽可能小的区块测试代码&#xff0c;并且尽可能地和其他的代码模块以及运行时的…

Java与查找算法(5):哈希查找

一、哈希查找 哈希查找&#xff0c;也称为散列查找&#xff0c;是一种基于哈希表的查找算法。哈希表是一种数据结构&#xff0c;它将键&#xff08;key&#xff09;映射到值&#xff08;value&#xff09;&#xff0c;使得查找某个键对应的值的时间复杂度为O(1)。哈希查找的过…

leetcode 2.两数相加(链表操作)

题目描述跳转到leetcode 给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 请你将两个数相加&#xff0c;并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外&#xff0…

常见的主流自动化测试框架,这5种真的帮助巨大

今天我们要向大家介绍的是常见5种主流自动化测试框架&#xff0c;包括优缺点等内容&#xff0c;供大家参考学习。 1.ATF 自动化测试框架AutoTestFramework是B/S架构框架&#xff0c;可实现Selenium等多种自动化测试全流程、团队化管理的高级框架平台&#xff0c;通过集成自动化…

【论文阅读笔记】Contrast image correction method

论文小结&#xff1a; 本文是2010年发表出来的一篇文章&#xff0c;提出的方法是一种增强对比度的方法&#xff0c;其基本原理是自适应参数的 ganma 校正。ganma 校正的目标在于同时校正曝光过度和曝光不足区域的图像。   同时&#xff0c;为了防止光晕伪影&#xff0c;使用双…

从零开始学Android开发期末复习重点

目录 前言作业&#xff11;作业&#xff12;作业&#xff13;作业4作业5作业6 前言 物联网应用技术课程期末复习重点——学习通作业&#xff1a; 操作系统&#xff1a;Ubuntu22.04 作业&#xff11; 简述Android系统架构。 Android 的系统架构和它的操作系统一样&#xff…

测试之路,你知道这些变化吗?突破后助你走得更远...

前言 Python自动化测试&#xff1a;7天练完这60个实战项目&#xff0c;年薪过35w。 目前的面试求职市场上&#xff0c;测试领域有哪些变化&#xff1f; 以这两年软件测试发展经历来看&#xff0c;现在的求职市场&#xff0c;已经不仅仅只考察个人的项目经验和技术能力了&#…