Groovy实现原理分析——准备工作
欢迎和大家交流技术相关问题:
邮箱: jiangxinnju@163.com
博客园地址: http://www.cnblogs.com/jiangxinnju
GitHub地址: https://github.com/jiangxincode
知乎地址: https://www.zhihu.com/people/jiangxinnju
首先说明一下为什么要写这样一系列分析Groovy实现原理的博文。我之前在华为大数据部门曾维护过一份规则引擎的项目,该项目说白了就是一种DSL(Domain Specified Language),把用户的输入转化为一种可以执行的程序。让不懂编程语言的用户只定义一些规则说明便可以完成流程编写。后来由于部门调动,接触不到原来的规则引擎了,但是无意间发现Groovy这种DSL语言的实现机制和当时的规则引擎原理大体相当,所以便借分析Groovy的实现原理,缅怀当时负责的规则引擎吧。同时也希望给其他对规则引擎开发、DSL开发或者编程语言开发感兴趣的朋友一个参考,权当抛砖引玉了。
作为这一系列文章的第一篇,我们先做一些准备工作,为后来的原理分析做下铺垫。
安装JDK
要分析Groovy的实现原理,首先需要从源码构建Groovy,这样一边调试,一边看代码效率会高些。源码构建Groovy,需要JDK 7+,下载安装说明参考官网:https://docs.oracle.com/javase,我使用的版本是:1.8.0_102。
PS C:\Users\jiang> java -version
java version "1.8.0_102"
Java(TM) SE Runtime Environment (build 1.8.0_102-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.102-b14, mixed mode)
安装Git工具
Git是当下最流行的版本管理工具,我们需要利用Git下载Groovy的源代码。Git下载安装请参考官网:http://git-scm.com/,我使用的版本是:2.16.2。
PS C:\Users\jiang> git --version
git version 2.16.2.windows.1
下载Groovy源码
Groovy的源码托管在Apache的网站上,但是Github上有镜像,我们可以直接在Github镜像下载最新的主干版本,然后切换到最新的稳定版本2.4.14对应的TAG上。
PS C:\Users\jiang> cd D:\temp\Groovy\
git clone https://github.com/apache/groovy.git
cd .\groovy\
PS D:\temp\Groovy\groovy> git checkout GROOVY_2_4_14
准备Gradle工具
Groovy的编译需要Gradle工具,但是该工具不需要我们自己下载、配置,我们可以直接执行如下命令:
PS D:\temp\Groovy\groovy> .\gradlew.bat
由于墙的原因,下载需要使用VPN,搭建VPN的方法这里不再叙述。命令执行完毕会在%USERPROFILE%\.gradle\wrapper\dists目录下下载对应版本的gradle,其中Groovy 2.4.14版本对应的Gradle版本是Gradle 2.14.1。
编译Groovy
执行下面命令,由源码编译Groovy:
.\gradlew.bat clean dist
编译完成后会在target\distributions目录下生成目标文件。
安装编译后的Groovy
我们将target\distributions\apache-groovy-binary-2.4.14.zip文件中的内容解压到某个目录,比如说C:\,然后在%PATH%环境变量中添加C:\groovy-2.4.14\bin,并设置%GROOVY_HOME%环境变量为C:\groovy-2.4.14。然后我们新打开一个powershell验证Groovy是否安装成功:
PS C:\Users\jiang> cd D:\temp\Groovy\
PS D:\temp\Groovy> groovy.bat -v
Groovy Version: 2.4.14 JVM: 1.8.0_102 Vendor: Oracle Corporation OS: Windows 10
将Groovy源码导入IDEA
为了更好的分析Groovy源码,我们需要一个IDE工具,具体是IDEA还是Eclipse或者其它都无所谓,看个人习惯,这里以IDEA为例。首先利用gradle生成IDEA项目:
PS D:\temp\Groovy> cd .\groovy\
PS D:\temp\Groovy\groovy> .\gradlew jarAll idea
这时候就可以使用IDEA导入groovy源码项目,进行分析研究了。
执行Groovy程序
我们首先利用IDEA新建一个Groovy项目,写一个简单的Groovy程序,该程序会打印"Hello World":
package edu.jiangxin.test
class Test {
static void main(def args) {
def mygreeting = "Hello World"
println mygreeting
}
}
我们知道Groovy是一种依赖于JVM的DSL,其先将.groovy文件编译成.class文件,然后调用JVM执行*.class文件,我们可以直接在IDEA中反编译该class文件,得到如下Java代码:
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//
package edu.jiangxin.test;
import groovy.lang.GroovyObject;
import groovy.lang.MetaClass;
import org.codehaus.groovy.runtime.callsite.CallSite;
public class Test implements GroovyObject {
public Test() {
CallSite[] var1 = $getCallSiteArray();
super();
MetaClass var2 = this.$getStaticMetaClass();
this.metaClass = var2;
}
public static void main(String... args) {
CallSite[] var1 = $getCallSiteArray();
Object mygreeting = "Hello World";
var1[0].callStatic(Test.class, mygreeting);
}
}
是不是看起来有些复杂?没关系我们会一点点搞懂它的。其实这里最关键的是三个函数$getCallSiteArray(),$getStaticMetaClass()以及callStatic(Object, Object),我们会在之后的文章中逐步揭开他们的面纱。但是在这之前,我们先看下Groovy是如何将之前的.groovy文件编译成对应的.class文件的。
(未完待续)
Groovy实现原理分析——准备工作的更多相关文章
- Tomcat源码分析——请求原理分析(中)
前言 在<TOMCAT源码分析——请求原理分析(上)>一文中已经介绍了关于Tomcat7.0处理请求前作的初始化和准备工作,请读者在阅读本文前确保掌握<TOMCAT源码分析——请求原 ...
- Tomcat源码分析——请求原理分析(上)
前言 谈起Tomcat的诞生,最早可以追溯到1995年.近20年来,Tomcat始终是使用最广泛的Web服务器,由于其使用Java语言开发,所以广为Java程序员所熟悉.很多人早期的J2EE项目,由程 ...
- 【转载】Select函数实现原理分析
Select函数实现原理分析 <原文> select需要驱动程序的支持,驱动程序实现fops内的poll函数.select通过每个设备文件对应的poll函数提供的信息判断当前是否有资源可用 ...
- Spring5深度源码分析(三)之AnnotationConfigApplicationContext启动原理分析
代码地址:https://github.com/showkawa/spring-annotation/tree/master/src/main/java/com/brian AnnotationCon ...
- Handler系列之原理分析
上一节我们讲解了Handler的基本使用方法,也是平时大家用到的最多的使用方式.那么本节让我们来学习一下Handler的工作原理吧!!! 我们知道Android中我们只能在ui线程(主线程)更新ui信 ...
- Java NIO使用及原理分析(1-4)(转)
转载的原文章也找不到!从以下博客中找到http://blog.csdn.net/wuxianglong/article/details/6604817 转载自:李会军•宁静致远 最近由于工作关系要做一 ...
- 原子类java.util.concurrent.atomic.*原理分析
原子类java.util.concurrent.atomic.*原理分析 在并发编程下,原子操作类的应用可以说是无处不在的.为解决线程安全的读写提供了很大的便利. 原子类保证原子的两个关键的点就是:可 ...
- Android中Input型输入设备驱动原理分析(一)
转自:http://blog.csdn.net/eilianlau/article/details/6969361 话说Android中Event输入设备驱动原理分析还不如说Linux输入子系统呢,反 ...
- 转载:AbstractQueuedSynchronizer的介绍和原理分析
简介 提供了一个基于FIFO队列,可以用于构建锁或者其他相关同步装置的基础框架.该同步器(以下简称同步器)利用了一个int来表示状态,期望它能够成为实现大部分同步需求的基础.使用的方法是继承,子类通过 ...
随机推荐
- JAVAEE——BOS物流项目04:学习计划、datagrid、分页查询、批量删除、修改功能
1 学习计划 1.datagrid使用方法(重要) n 将静态HTML渲染为datagrid样式 n 发送ajax请求获取json数据创建datagrid n 使用easyUI提供的API创建data ...
- 【翻译】CSS Animations VS the Web Animations API:案例学习
原文地址:CSS Animations vs the Web Animations API: A Case Study May 03, 2017 css, javascript 上周我写了我如何使用C ...
- Ubuntu16.04解决无法切换root权限的问题
在su root时发现无法切换到root权限.显示: /usr/local/bin/zsh 没有文件或目录 想了想问题所在,突然想起来前段时间想要更换shell主题,于是装了zsh和oh-my-zsh ...
- 织梦调用seotitle
如果有seotitle则调用seotitle,没有则调用title {dede:field.array runphp='yes'} if(@me['seotitle']=='') {@me=@me[' ...
- neo-thinsdk-cs 之 thinWallet 接入私链
neo-thinsdk-cs 之 thinWallet 接入私链 2017年底刚开始接触区块链,目前在被 NEO 折磨. 一开始被官方文档和 NEO-GUI 搞得体无完肤(尤其是传说中的 F12),也 ...
- 十年磨一剑 Delphi重新崛起再写传奇
新年伊始,英巴卡迪诺公司(Embarcadero)就在其官网发布了"激动人心的RAD Studio2018年发展规划"公告(见上图).公告中指出,将在于2018年第一季度发布10. ...
- 前端开发利器webStorm
这里推荐一个前端开发工具webStorm.用了大概快半年了,发现所有其他工具无出其右的.目前最新版本已经到4.0.2,半年前还是2.X 相比aptana.dreamweaver.sublime和vim ...
- CSS预处理器之Less详解
本文最初发表于博客园,并在GitHub上持续更新前端的系列文章.欢迎在GitHub上关注我,一起入门和进阶前端. 以下是正文. CSS 预处理器 为什么要有 CSS 预处理器 CSS基本上是设计师的工 ...
- php提供的sapi有哪些?CGI、FastCGI、php-fpm、php-cgi解释
一.前言 一直对PHP的sapi是什么东西好奇,在网上一查都是各种说fpm cgi fastcgi php-cgi 直到看了鸟哥的这篇文章介绍戳这里,看到源码下的sapi目录才有所了解. 二.sapi ...
- Eclipse搭建Maven项目之准备工作
Maven是优秀的Java项目对象模型解决方案,意为知识的积累(意地绪文),Maven可以方便的解决Java项目包依赖问题,通过配置pom.xml引入依赖,并自动引入其他依赖. 操作系统版本:wind ...