groovy

What is the Groovy 'it'?

故事扮演 提交于 2020-08-25 04:40:27
问题 I have a collection which I process with removeIf {} in Groovy. Inside the block, I have access to some it identifier. What is this and where is it documented? 回答1: it is an implicit variable that is provided in closures. It's available when the closure doesn't have an explicitly declared parameter. When the closure is used with collection methods, such as removeIf , it will point to the current iteration item. It's like you declared this: List<Integer> integers = [1, 2, 3] for(Integer it:

【Spring】Spring AOP 代理对象生成逻辑源码分析

非 Y 不嫁゛ 提交于 2020-08-20 08:16:23
1. spring aop案例(POJO注入) 1.0 被代理接口 TargetInterface /** * 被代理的接口 * @author Yang ZhiWei */ public interface TargetInterface { void show(); String showName(); } 1.1 被代理对象 @Slf4j public class TargetObject implements TargetInterface { @Override public void show() { log.info("show----->I am a TargetObject!"); } @Override public String showName() { return "showName--->TargetObject !"; } } 1.2 通知 MyAdvice @Slf4j public class MyAdvice { public void takeSeat() { log.info("====> MethodBeforeAdvice:Take Seat!"); } public void turnOffPhone() { log.info("==> MethodBeforeAdvice:turn Off Phone!"); } public

Android gradle 自定义插件

末鹿安然 提交于 2020-08-19 03:19:00
Gradle 的插件有三种打包方式: 构建脚本:插件逻辑写在 build.gradle 中,适用于逻辑简单的任务,但是该方式实现的插件在该构建脚本之外是不可见的,只能用于当前脚本。 buildSrc项目:根据语言插件代码放在 rootProjectDir/buildSrc/src/main/groovy 目录中或者 rootProjectDir/buildSrc/src/main/java 或者rootProjectDir/buildSrc/src/main/kotlin,该插件对于该项目中构建使用的每个构建脚本都是可见的,适用于逻辑复杂但又不需要对外可见的插件 独立项目:一个独立的 Groovy/Java/Kotlin 项目,该项目生成并发布一个 jar 然后可以在多个版本中使用它并与他人共享,并且此 jar 包可能包含一些插件,或者将多个相关的任务类捆绑到单个库中 接下来我们先从基本的构建脚本中的插件开始 1、构建脚本: 创建 Gradle 插件,需要创建一个实现 Plugin 接口的类,当插件应用于项目时,Gradle 会创建插件类的实例并调用实例的 apply() 方法,如果需要的话,插件还可以用于配置项目 把插件变得可配置,添加一些简单扩展属性到 project 上,比如可以添加一个 greeting 扩展对象到 project 上,这就允许我们去配置 greeting

Java8中你可能不知道的一些地方之Lambda

谁都会走 提交于 2020-08-18 20:53:02
Lambda 表达式(也称为闭包),它允许我们将函数当成参数传递给某个方法,或者把代码本身当作数据处理。很多语言(Groovy、Scala等)从设计之初就支持 Lambda 表达式。但是 java 中使用的是匿名内部类代替。最后借助强大的社区力量,找了一个折中的 Lambda 实现方案,可以实现简洁而紧凑的语言结构。 一、匿名内部类到Lambda的演化 匿名内部类,即一个没有名字的,存在于一个类或方法内部的类。当我们需要用某个类且只需要用一次,创建和使用合二为一时,我们可以选择匿名内部类,省掉我们定义类的步骤。 匿名内部类会隐式的继承一个类或实现一个接口,或者说匿名内部类是一个继承了该类或者实现了该接口的子类匿名对象。下面看一个匿名内部类的例子: 测试类中调用方法 package com.lotbyte.main; /* 定义和使用匿名内部类 */ public class NoNameClass { public static void main(String[] args) { Model m = new Model(){ @Override public void func() { System.out.println("方法的实现"); } }; m.func(); } } // 需要被实现的接口 interface Model{ void func(); } 二

Java 的新未来:逐渐“Kotlin 化”

若如初见. 提交于 2020-08-17 18:16:50
我们行业始终有一个热门话题,那就是对 Java 的批判,这种批判很大程度上来源于 Java 的繁琐性以及它所生成的大量样板式代码 ,而这些代码在很多场景下是根本不需要的。 虽然我一直以来都很喜欢 Java,但是我不能说这些指责是错误的。的确,Java 的繁琐性以及数量不菲的杂乱代码在很多情况下会很烦人。在大多数情况下,我们不得不接受我们生活在一个不完美的世界这一现实,很多时候,我们必须两害相权取其轻。我们都知道,Java 并不完美,但是主要的问题在于在此之前为什么没有采取任何措施来解决这些问题呢? 我认为,变更需要耗费这么长时间的唯一原因就是 Java 缺乏足够的竞争。 Java 语言之所以能够主导市场,可能就是因为缺乏真正的竞争对手 ,当然也要归功于 Sun 和 Oracle 先后做出的巨大努力。 Java 提供的强类型安全性,以及作为一个结构良好的语言所带来的其他特性,使其成为大型项目中非常流行的语言 。通过使用 Java,我们很少会让事情变得难以收拾。Java 的另外一个重要特点是作为多平台语言,它运行在自己的虚拟机上,这使其能够完美契合很多的组织。如果你通过著名的 JIT 编译器启用了其自动性能优化的固有能力,那么在很多情况下都能将糟糕代码所带来的影响最小化,这样我们就有了一组使用 Java 的坚实理由。 但是,后来发生了什么呢?接下来的事情就是,能够像 Java

使用 Jenkins 与 Sonar 集成对代码进行持续检测

隐身守侯 提交于 2020-08-17 15:27:39
SonarQube 8.4 发布,分析时间最多可减少 80% 有碰到再去整理一次吧。先放一下以前的学习笔记 SonarQube 与 jenkins 简 介 SonarQube 是 一个开源的代码质量分析平台,便于管理代码的质量,可检查出项目代码的漏洞和潜在的逻辑问题。同时,它提供了丰富的插件,支持多种语言的检测, 如 J ava、Python、Groovy、C、C++等几十种编程语言的检测。它主要的核心价值体现在如下几个方面: 检查代码是否遵循编程标准:如命名规范,编写的规范等。 检查设计存在的潜在缺陷:SonarQub e 通 过插 件 F indbugs、Checkstyl e 等 工具检测代码存在的缺陷。 检测代码的重复代码量:SonarQub e 可 以展示项目中存在大量复制粘贴的代码。 检测代码中注释的程度:源码注释过多或者太少都不好,影响程序的可读可理解性。 检测代码中包、类之间的关系:分析类之间的关系是否合理,复杂度情况。 SonarQub e 平 台是 由 4 个 部分组成: SonarQube Server SonarQube Database SonarQube Plugins SonarQube Scanner wget -c https://sonarsource.bintray.com/Distribution/sonarqube/sonarqube-6

秒懂java规则表达式框架Aviator2.3.0

烂漫一生 提交于 2020-08-17 06:08:32
背景 在我们的业务场景中有一个需求,我们有一个配置功能,该功能需要配置两个变量之间比较大小。使用tab比较难表达,所以就提出了,可以让用户写比较简单的函数进行配置。或者选tab进行选择(前段直接将对应的tab字符串拼接来给后端执行)。 或者这么说吧,可以通过字符串的表达的意思,进行执行这个字符串的索要表达的逻辑,且这个逻辑和这个字符串可以自定义。 Aviator 简介 Aviator是一个高性能、轻量级的java语言实现的表达式求值引擎,主要用于各种表达式的动态求值。现在已经有很多开源可用的java表达式求值引擎,为什么还需要Avaitor呢? Aviator的设计目标是 轻量级 和*高性能 ,相比于Groovy、JRuby的笨重,Aviator非常小,加上依赖包也才450K,不算依赖包的话只有70K;当然,Aviator的语法是受限的,它不是一门完整的语言,而只是语言的一小部分集合。 其次,Aviator的实现思路与其他轻量级的求值器很不相同,其他求值器一般都是通过解释的方式运行,而Aviator则是直接将表达式*编译成Java字节码,交给JVM去执行。简单来说,Aviator的定位是介于Groovy这样的重量级脚本语言和IKExpression这样的轻量级表达式引擎之间。 内部原理 任何语言都是通过一步一步的抽象,从硬件原理再到我们人类可以认识的语言。

Spring Boot 五种热部署方式,极速开发就是生产力!

百般思念 提交于 2020-08-16 12:16:29
作者:若离x 来源:my.oschina.net/ruoli/blog/1590148 1、模板热部署 在 Spring Boot 中,模板引擎的页面默认是开启缓存的,如果修改了页面的内容,则刷新页面是得不到修改后的页面的,因此我们可以在application.properties中关闭模版引擎的缓存,如下: Thymeleaf的配置: spring.thymeleaf.cache=false FreeMarker的配置: spring.freemarker.cache=false Groovy的配置: spring.groovy.template.cache=false Velocity的配置: spring.velocity.cache=false 2、使用调试模式Debug实现热部署 此种方式为最简单最快速的一种热部署方式,运行系统时使用Debug模式,无需装任何插件即可,但是无发对配置文件,方法名称改变,增加类及方法进行热部署,使用范围有限。 3、spring-boot-devtools 在 Spring Boot 项目中添加 spring-boot-devtools依赖即可实现页面和代码的热部署。详细用法可以参考这篇文章: Spring Boot 实现热部署 。 如下: <dependency> <groupId>org.springframework.boot<

Gradle系列之认识Gradle任务

我只是一个虾纸丫 提交于 2020-08-16 03:33:16
原文发于微信公众号 jzman-blog,欢迎关注交流。 前面几篇学习了 Gradle 构建任务的基础知识,了解了 Project 和 Task 这两个概念,建议先阅读前面几篇文章: Gradle系列之初识Gradle Gradle之Groovy基础篇 Gradle系列之构建脚本基础 Gradle 的构建工作是有一系列的 Task 来完成的,本文将针对 Task 进行详细介绍,本文主要内容如下: 多种方式创建任务 多种方式访问任务 任务分组和描述 操作符 任务的执行分析 任务排序 任务的启用和禁用 任务的onlyIf断言 任务规则 多种方式创建任务 Gradle 中可以使用多种方式来创建任务,多种创建任务的方式最终反映在 Project 提供的快捷方法以及内置的 TaskContainer 提供的 create 方法,下面是几种常见的创建任务的方式: /** * 第一种创建任务方式: * 方法原型:Task task(String name) throws InvalidUserDataException; */ //定义Task变量接收task()方法创建的Task,方法配置创建的Task def Task taskA = task(taskA) //配置创建的Task taskA.doFirst { println "第一种创建任务的方式" } /**task *

日常记录——JVM—JVM简介、class文件解析

99封情书 提交于 2020-08-16 00:05:52
一、JVM简介 JVM :Java Virtual MAchine-Java虚拟机,可以将class文件解释为各种平台可执行的指令行,java中一个类在运行时,首先将java文件编译(javac)为class文件,然后jvm将class文件解释并执行。 JVM可分为三部分:类加载器(ClassLoader)系统、执行引擎、运行时数据区。 类加载器系统 :负责加载程序中的类和接口。 执行引擎 :解释执行+即时编译(JIT),开始对所有的代码都采取解释执行的方式,经常调用的热点方法编译为本地代码(热点代码频率设置-XX:CompileThreshould = 值(默认10000)),默认是解释执行+即时编译(-Xmixed)模式,可设置为纯解释(-Xint)或者纯编译(-Xcomp)模式,纯解释加载快,执行慢,纯编译加载慢,执行快。 运行时数据区 :程序计数器、本地方法栈、虚拟机栈、堆、方法区。 1.程序计数器:指向当前线程所执行的字节码的行号,线程私有。 2.本地方法栈:存储本地方法调用的状态,Native方法,线程私有。 3.虚拟机栈:存储局部变量表,操作数栈,动态链接,方法出口等信息,线程私有。 4.堆:虚拟机启动时创建,存放对象实例和数组,GC工作区域,线程共享。 5.方法区:存储类的信息,如常量(final)、静态变量(static)、JIT(即时编译器)编译后的代码