不知道大家有没有发现在语言发展过程中,存在这么一个规律:能成为未来主流语言的,必与当前主流语言属同一‘语系’,换句话说,由王子继承王位。
在C语言之前,似乎还处于‘春秋战国’,各种编程语言混战,于20世纪70年代,C语言成为‘秦始皇’,各种软件甚至操作系统也改用C语言编写。但可惜C语言是面向过程的,程序代码一多,逻辑流程就容易混乱,再加上全局变量和可运算指针的添乱,使程序员调试程序万般辛苦。
20世纪80年代,C++应运而生,它继承了C语言(包括C语言的语法),并添加了类等特性,使C++成为一种面向对象的语言。但C++的多继承,人工内存管理,从C语言那里继承的可运算指针等问题同样使程序员万般痛苦。
20世纪90年代,正当人们饱受煎熬的时候,Java诞生了,她去除了C++中的糟粕,保留了C++中的精华(包括语法),并添加了一些自己的特性,比如垃圾回收器,接口等。我听很多由C++转Java的朋友说过这么一句话:用Java写程序简直是一种享受。可惜Java的那优美的语法使之失去了‘轻盈’的身躯,程序员需要写相对比较多的代码来完成同样的功能。此外Java代码即使编译为class文件,也能被“高质量”反编译为Java文件获得源码。
21世纪初,Groovy( http://groovy.codehaus.org 背后有ThoughtWorks, Big Sky等公司的支持)横空出世,她几乎兼容Java的所有语法,并能无需转换直接利用Java所写的类及接口,在Spring2中可以透明地注入Groovy对象(与注入Java对象没有任何区别),且拥有自己的一些‘敏捷’特性,如动态类型,Closure,Mixins等,以及对应J2EE中如JSP, Servlet的Groovy敏捷版--GSP以及Groovlet等,不但如此她还拥有Ruby最引以为傲的Ruby on Rails的对应实现版本但非克隆--Grails( http://grails.org 背后有Oracle的支持),此外Groovy代码编译为class文件后,即使不混淆,反编译后获得的Java源代码也“极难”读懂(换句话说,如果您能读懂这些反编译得来的源码,那您早就用不着hack人家的class文件了),原因是Groovy自身就是用Java编写的,class文件烙有Groovy的印迹。?指代谁至今还不太明了,但Groovy至少已经具备了继承王位的必要条件--语言本身是利用当前主流语言所编写,并与当前主流语言的语法相似,且能够结束当前主流语言的弊病。
综上所述,选择Java世界中动态语言Groovy(Groovy = Java + Python + Ruby + Smalltalk),至少是明智的,不仅因为她是JVM上JCP全票通过的官方标准语言,更因为她身上具有王储的特质。Groovy之于Java犹如Java之于C++。另外,由于Groovy本身就是用Java写的,所以对Groovy的‘投资’能够得到保值。因为Groovy的程序能运行于JDK1.4+之上,所以Groovy的新特性(比如Groovy1.1中新添加的Annotations以及static import)不会像Java中的新特性(比如Java5中的Generics以及Annotations等)那样无法在旧版JDK上使用,这就起到了保值作用。如果说Java实现了跨平台,那么Groovy不仅实现了跨平台而且实现了跨Java平台。
附关于Groovy的JCP投票结果:
再来看一个Groovy官方网站( http://groovy.codehaus.org )上的例子,在官方网站上还有许多教程和应用实例,大家不妨去看看。
利用已存在的Java类库:
import org.apache.commons.lang.WordUtils
class Greet {
def name
Greet(who) { name = who[0].toUpperCase() + who[1..-1] }
def salute() { println "Hello $name!" }
}
class Greeter extends Greet {
Greeter(who) { name = WordUtils.capitalize(who) }
}
new Greeter('world').salute()
class Greet {
def name
Greet(who) { name = who[0].toUpperCase() + who[1..-1] }
def salute() { println "Hello $name!" }
}
class Greeter extends Greet {
Greeter(who) { name = WordUtils.capitalize(who) }
}
new Greeter('world').salute()
最后,看看Groovy与其他Java世界的动态语言的受关注程度的比较吧,从图中可以看出,Groovy有压倒性趋势:
--------------------------------------------------------------------------------------
文中提到的通过反编译获得源码:
将HelloWorld.groovy编译为HelloWorld.class,然后将HelloWorld.class反编译为HelloWorld.java
HelloWorld.groovy的源码:
<!---->class HelloWorld {
static void main(String[] args) {
println "Hello, world!"
}
}
static void main(String[] args) {
println "Hello, world!"
}
}
HelloWorld.class反编译得到的Java文件HelloWorld.java:
<!---->// Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.
// Jad home page: http://www.kpdus.com/jad.html
// Decompiler options: packimports(3)
// Source File Name: HelloWorld.groovy
import groovy.lang.GroovyObject;
import groovy.lang.MetaClass;
import org.codehaus.groovy.runtime.ScriptBytecodeAdapter;
public class HelloWorld
implements GroovyObject
{
public HelloWorld()
{
MetaClass metaclass;
Class class1 = HelloWorld.class;
Class class2 = groovy.lang.MetaClass.class;
metaclass = (MetaClass)ScriptBytecodeAdapter.castToType(ScriptBytecodeAdapter.invokeStaticMethodN(class1, org.codehaus.groovy.runtime.ScriptBytecodeAdapter.class, "initMetaClass", new Object[] {
this
}), class2);
metaclass;
(MetaClass)ScriptBytecodeAdapter.castToType(metaclass, class2);
this;
JVM INSTR swap ;
metaClass;
JVM INSTR pop ;
}
public static void main(String args[])
{
Class class1 = HelloWorld.class;
Class class2 = groovy.lang.MetaClass.class;
ScriptBytecodeAdapter.invokeStaticMethodN(class1, class1, "println", new Object[] {
"Hello, world!"
});
}
public MetaClass getMetaClass()
{
Class class2;
MetaClass metaclass;
Class class1 = HelloWorld.class;
class2 = groovy.lang.MetaClass.class;
if(!ScriptBytecodeAdapter.compareEqual(metaClass, null))
break MISSING_BLOCK_LABEL_118;
metaclass = (MetaClass)ScriptBytecodeAdapter.castToType(ScriptBytecodeAdapter.invokeStaticMethodN(class1, org.codehaus.groovy.runtime.ScriptBytecodeAdapter.class, "initMetaClass", new Object[] {
this
}), class2);
metaclass;
(MetaClass)ScriptBytecodeAdapter.castToType(metaclass, class2);
this;
JVM INSTR swap ;
metaClass;
JVM INSTR pop ;
return (MetaClass)ScriptBytecodeAdapter.castToType(metaClass, class2);
}
public Object invokeMethod(String method, Object arguments)
{
Class class1;
MetaClass metaclass;
class1 = HelloWorld.class;
Class class2 = groovy.lang.MetaClass.class;
if(!ScriptBytecodeAdapter.compareEqual(metaClass, null))
break MISSING_BLOCK_LABEL_121;
metaclass = (MetaClass)ScriptBytecodeAdapter.castToType(ScriptBytecodeAdapter.invokeStaticMethodN(class1, org.codehaus.groovy.runtime.ScriptBytecodeAdapter.class, "initMetaClass", new Object[] {
this
}), class2);
metaclass;
(MetaClass)ScriptBytecodeAdapter.castToType(metaclass, class2);
this;
JVM INSTR swap ;
metaClass;
JVM INSTR pop ;
return ScriptBytecodeAdapter.invokeMethodN(class1, metaClass, "invokeMethod", new Object[] {
this, method, arguments
});
}
public Object getProperty(String property)
{
Class class1;
MetaClass metaclass;
class1 = HelloWorld.class;
Class class2 = groovy.lang.MetaClass.class;
if(!ScriptBytecodeAdapter.compareEqual(metaClass, null))
break MISSING_BLOCK_LABEL_118;
metaclass = (MetaClass)ScriptBytecodeAdapter.castToType(ScriptBytecodeAdapter.invokeStaticMethodN(class1, org.codehaus.groovy.runtime.ScriptBytecodeAdapter.class, "initMetaClass", new Object[] {
this
}), class2);
metaclass;
(MetaClass)ScriptBytecodeAdapter.castToType(metaclass, class2);
this;
JVM INSTR swap ;
metaClass;
JVM INSTR pop ;
return ScriptBytecodeAdapter.invokeMethodN(class1, metaClass, "getProperty", new Object[] {
this, property
});
}
public void setProperty(String property, Object value)
{
Class class1;
MetaClass metaclass;
class1 = HelloWorld.class;
Class class2 = groovy.lang.MetaClass.class;
if(!ScriptBytecodeAdapter.compareEqual(metaClass, null))
break MISSING_BLOCK_LABEL_121;
metaclass = (MetaClass)ScriptBytecodeAdapter.castToType(ScriptBytecodeAdapter.invokeStaticMethodN(class1, org.codehaus.groovy.runtime.ScriptBytecodeAdapter.class, "initMetaClass", new Object[] {
this
}), class2);
metaclass;
(MetaClass)ScriptBytecodeAdapter.castToType(metaclass, class2);
this;
JVM INSTR swap ;
metaClass;
JVM INSTR pop ;
ScriptBytecodeAdapter.invokeMethodN(class1, metaClass, "setProperty", new Object[] {
this, property, value
});
return;
}
public void setMetaClass(MetaClass value)
{
Class class2;
Class class1 = HelloWorld.class;
class2 = groovy.lang.MetaClass.class;
value;
(MetaClass)ScriptBytecodeAdapter.castToType(value, class2);
this;
JVM INSTR swap ;
metaClass;
JVM INSTR pop ;
}
void super$1$wait()
{
super.wait();
}
String super$1$toString()
{
return super.toString();
}
void super$1$wait(long l)
{
super.wait(l);
}
void super$1$notify()
{
super.notify();
}
void super$1$notifyAll()
{
super.notifyAll();
}
Class super$1$getClass()
{
return super.getClass();
}
boolean super$1$equals(Object obj)
{
return super.equals(obj);
}
Object super$1$clone()
{
return super.clone();
}
int super$1$hashCode()
{
return super.hashCode();
}
void super$1$wait(long l, int i)
{
super.wait(l, i);
}
void super$1$finalize()
{
super.finalize();
}
transient MetaClass metaClass;
public static Long __timeStamp;
static
{
Long long1;
Class class1 = HelloWorld.class;
Class class2 = groovy.lang.MetaClass.class;
long1 = new Long(0x1121e0ead4dL);
Long _tmp = long1;
__timeStamp = (Long)long1;
}
}
// Jad home page: http://www.kpdus.com/jad.html
// Decompiler options: packimports(3)
// Source File Name: HelloWorld.groovy
import groovy.lang.GroovyObject;
import groovy.lang.MetaClass;
import org.codehaus.groovy.runtime.ScriptBytecodeAdapter;
public class HelloWorld
implements GroovyObject
{
public HelloWorld()
{
MetaClass metaclass;
Class class1 = HelloWorld.class;
Class class2 = groovy.lang.MetaClass.class;
metaclass = (MetaClass)ScriptBytecodeAdapter.castToType(ScriptBytecodeAdapter.invokeStaticMethodN(class1, org.codehaus.groovy.runtime.ScriptBytecodeAdapter.class, "initMetaClass", new Object[] {
this
}), class2);
metaclass;
(MetaClass)ScriptBytecodeAdapter.castToType(metaclass, class2);
this;
JVM INSTR swap ;
metaClass;
JVM INSTR pop ;
}
public static void main(String args[])
{
Class class1 = HelloWorld.class;
Class class2 = groovy.lang.MetaClass.class;
ScriptBytecodeAdapter.invokeStaticMethodN(class1, class1, "println", new Object[] {
"Hello, world!"
});
}
public MetaClass getMetaClass()
{
Class class2;
MetaClass metaclass;
Class class1 = HelloWorld.class;
class2 = groovy.lang.MetaClass.class;
if(!ScriptBytecodeAdapter.compareEqual(metaClass, null))
break MISSING_BLOCK_LABEL_118;
metaclass = (MetaClass)ScriptBytecodeAdapter.castToType(ScriptBytecodeAdapter.invokeStaticMethodN(class1, org.codehaus.groovy.runtime.ScriptBytecodeAdapter.class, "initMetaClass", new Object[] {
this
}), class2);
metaclass;
(MetaClass)ScriptBytecodeAdapter.castToType(metaclass, class2);
this;
JVM INSTR swap ;
metaClass;
JVM INSTR pop ;
return (MetaClass)ScriptBytecodeAdapter.castToType(metaClass, class2);
}
public Object invokeMethod(String method, Object arguments)
{
Class class1;
MetaClass metaclass;
class1 = HelloWorld.class;
Class class2 = groovy.lang.MetaClass.class;
if(!ScriptBytecodeAdapter.compareEqual(metaClass, null))
break MISSING_BLOCK_LABEL_121;
metaclass = (MetaClass)ScriptBytecodeAdapter.castToType(ScriptBytecodeAdapter.invokeStaticMethodN(class1, org.codehaus.groovy.runtime.ScriptBytecodeAdapter.class, "initMetaClass", new Object[] {
this
}), class2);
metaclass;
(MetaClass)ScriptBytecodeAdapter.castToType(metaclass, class2);
this;
JVM INSTR swap ;
metaClass;
JVM INSTR pop ;
return ScriptBytecodeAdapter.invokeMethodN(class1, metaClass, "invokeMethod", new Object[] {
this, method, arguments
});
}
public Object getProperty(String property)
{
Class class1;
MetaClass metaclass;
class1 = HelloWorld.class;
Class class2 = groovy.lang.MetaClass.class;
if(!ScriptBytecodeAdapter.compareEqual(metaClass, null))
break MISSING_BLOCK_LABEL_118;
metaclass = (MetaClass)ScriptBytecodeAdapter.castToType(ScriptBytecodeAdapter.invokeStaticMethodN(class1, org.codehaus.groovy.runtime.ScriptBytecodeAdapter.class, "initMetaClass", new Object[] {
this
}), class2);
metaclass;
(MetaClass)ScriptBytecodeAdapter.castToType(metaclass, class2);
this;
JVM INSTR swap ;
metaClass;
JVM INSTR pop ;
return ScriptBytecodeAdapter.invokeMethodN(class1, metaClass, "getProperty", new Object[] {
this, property
});
}
public void setProperty(String property, Object value)
{
Class class1;
MetaClass metaclass;
class1 = HelloWorld.class;
Class class2 = groovy.lang.MetaClass.class;
if(!ScriptBytecodeAdapter.compareEqual(metaClass, null))
break MISSING_BLOCK_LABEL_121;
metaclass = (MetaClass)ScriptBytecodeAdapter.castToType(ScriptBytecodeAdapter.invokeStaticMethodN(class1, org.codehaus.groovy.runtime.ScriptBytecodeAdapter.class, "initMetaClass", new Object[] {
this
}), class2);
metaclass;
(MetaClass)ScriptBytecodeAdapter.castToType(metaclass, class2);
this;
JVM INSTR swap ;
metaClass;
JVM INSTR pop ;
ScriptBytecodeAdapter.invokeMethodN(class1, metaClass, "setProperty", new Object[] {
this, property, value
});
return;
}
public void setMetaClass(MetaClass value)
{
Class class2;
Class class1 = HelloWorld.class;
class2 = groovy.lang.MetaClass.class;
value;
(MetaClass)ScriptBytecodeAdapter.castToType(value, class2);
this;
JVM INSTR swap ;
metaClass;
JVM INSTR pop ;
}
void super$1$wait()
{
super.wait();
}
String super$1$toString()
{
return super.toString();
}
void super$1$wait(long l)
{
super.wait(l);
}
void super$1$notify()
{
super.notify();
}
void super$1$notifyAll()
{
super.notifyAll();
}
Class super$1$getClass()
{
return super.getClass();
}
boolean super$1$equals(Object obj)
{
return super.equals(obj);
}
Object super$1$clone()
{
return super.clone();
}
int super$1$hashCode()
{
return super.hashCode();
}
void super$1$wait(long l, int i)
{
super.wait(l, i);
}
void super$1$finalize()
{
super.finalize();
}
transient MetaClass metaClass;
public static Long __timeStamp;
static
{
Long long1;
Class class1 = HelloWorld.class;
Class class2 = groovy.lang.MetaClass.class;
long1 = new Long(0x1121e0ead4dL);
Long _tmp = long1;
__timeStamp = (Long)long1;
}
}
附:通过与Java的比较,迅速掌握Groovy
相关推荐
标题中的“Groovy和Java相互调用1”指的是在编程时如何在Groovy语言环境中调用Java类,以及反之,如何在Java程序中调用Groovy类。这是一种跨语言交互的方式,特别是在混合使用Groovy和Java的项目中非常常见。 ...
Groovy 是一种基于 JVM 的动态编程语言,与 Java 兼容,但语法更加简洁和灵活。GMock 在 Groovy 中作为一个 mock 工具,允许开发者创建模拟对象来替代真实对象,以便在测试中隔离被测代码,避免外部依赖的影响。这...
在Java开发中,Groovy是一种强大的、动态类型的脚本语言,它可以无缝地与Java代码集成,为开发者提供了更简洁、灵活的语法。本文将深入探讨在Java项目中使用Groovy的三种主要方式,并阐述它们各自的优势和应用场景。...
1. 引入Groovy库:在Java项目中添加Groovy的相关依赖,通常是`groovy-all`,确保Java能够访问Groovy运行时环境。 2. 创建GroovyClassLoader:使用这个类加载器可以动态加载和执行Groovy脚本。它继承自Java的...
标题“hugo110-java_run_groovy-master_java_”表明这是一个关于使用Java运行Groovy脚本的项目,可能是某个GitHub仓库的克隆或归档。描述中提到,这个环境是为了方便用户(可能是开发者)实践Groovy语言,并为后续的...
这段代码会创建一个`GroovyShell`实例,解析Groovy字符串,并打印出“Hello, World from Groovy!”。 另一方面,`GroovyScriptEngine`是`ScriptEngineManager`的一部分,通常用于JSR-223兼容的脚本引擎,如...
【Java未来发展——JVM7】 Java作为一门广泛使用的编程语言,其未来发展一直是开发者关注的焦点。JVM(Java虚拟机)作为Java平台的核心,它的每一次重大更新都会对Java生态系统产生深远影响。JVM7,即Java 7,是...
SpringBoot、Gradle、Maven、Java和Groovy是Java生态系统中的重要组成部分,它们在现代软件开发中扮演着至关重要的角色。这篇详细的知识点解析将深入探讨这些技术及其相互关系。 1. **SpringBoot**: SpringBoot是...
《实战Java虚拟机——JVM故障诊断与性能优化》内容简介:随着越来越多的第三方语言(Groovy、Scala、JRuby等)在Java虚拟机上运行,Java也俨然成为一个充满活力的生态圈。本书将通过200余示例详细介绍Java虚拟机中的...
Groovy是一种基于Java平台的动态脚本语言,它在Java开发者中越来越受欢迎,因为它提供了简洁、灵活的语法,以及强大的动态编程能力。Groovy与Java兼容性极佳,可以直接调用Java类库,使得它在Java生态系统中具有广泛...
Java 嵌入运行 Groovy 代码是一种常见的技术实践,特别是在需要动态脚本执行或灵活扩展功能的场景中。Groovy 是一种与 Java 兼容的动态编程语言,它的语法简洁,适合编写脚本和快速原型开发。在 Java 应用程序中运行...
随着越来越多的第三方语言(Groovy、Scala、JRuby等)在Java虚拟机上运行,Java也俨然成为了一个充满活力的生态圈。《实战Java虚拟机——JVM故障诊断与性能优化》将通过200余示例详细介绍Java虚拟机中的各种参数配置...
Making Java Groovy is a practical handbook for developers who want to blend Groovy into their day to day work with Java It starts by introducing the key differences between Java and Groovy and how you...
《Show Your ToolBox——锋利的Groovy》 在IT领域,工具的选择和使用往往直接影响到工作效率和项目质量。本文将深入探讨Groovy这门强大的动态编程语言,它以其灵活性和与Java的紧密集成,成为了许多开发者的得力...
### Java与Groovy:融合的力量 #### 知识点一:Java与Groovy的关系 - **定义**:Groovy是一种面向对象的编程语言,它直接运行在Java平台上,并且能够与现有的Java代码无缝集成。 - **特点**: - **语法简洁**:...
Groovy环境搭建教程中的例子工程,纯Java、纯Groovy以及Java+Groovy混合 教程参考:http://blog.csdn.net/rcom10002/archive/2011/06/26/6568557.aspx
Script script = shell.parse("println 'Hello, Groovy!'"); script.run(); ``` ### 脚本引擎的通用操作 无论哪种脚本语言,都可以通过`ScriptEngine`提供的方法执行脚本、设置全局变量、获取结果等。例如: ```...
Java整合Groovy脚本,Java整合Groovy脚本Java整合Groovy脚本,Java整合Groovy脚本Java整合Groovy脚本,Java整合Groovy脚本Java整合Groovy脚本,Java整合Groovy脚本Java整合Groovy脚本,Java整合Groovy脚本Java整合...
《Groovy编程:Java开发者的入门指南》是Kenneth Barclay和John Savage为Java开发者编写的关于Groovy语言的详细介绍。此书首次出版于2006年,由Morgan Kaufmann Publishers出版,该出版社隶属于Elsevier集团。本书...
这将在控制台打印出"Hello, Groovy!"。 6. **使用IDE集成Groovy**: 虽然可以通过命令行进行Groovy开发,但使用集成开发环境(IDE)会带来更多的便利。推荐使用IntelliJ IDEA或Eclipse,它们都有强大的Groovy支持...