<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    First they ignore you
    then they ridicule you
    then they fight you
    then you win
        -- Mahatma Gandhi
    Chinese => English     英文 => 中文             
    隨筆-221  評論-1047  文章-0  trackbacks-0
    讓我們來回顧一下主流語言的發展歷程:機器語言(由01組成) -> 匯編語言 -> ... ->?C語言 -> C++ -> Java -> ?

    不知道大家有沒有發現在語言發展過程中,存在這么一個規律:能成為未來主流語言的,必與當前主流語言屬同一‘語系’,換句話說,由王子繼承王位。

    在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? 背后有SpringSource,Big Sky等公司的支持)橫空出世,她幾乎兼容Java的所有語法,并能無需轉換直接利用Java所寫的類及接口,在Spring2中可以透明地注入Groovy對象(與注入Java對象沒有任何區別),且擁有自己的一些‘敏捷’特性,如動態類型,Closure,Mixins等,以及對應J2EE中如JSP, Servlet的Groovy敏捷版--GSP以及Groovlet等,不但如此她還擁有Ruby最引以為傲的Ruby on Rails的對應實現版本但非克隆--Grails(?http://grails.org? 背后有SpringSource和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()


    最后,看看Groovy與其他Java世界的動態語言的受關注程度的比較吧,從圖中可以看出,Groovy有壓倒性趨勢:



    --------------------------------------------------------------------------------------
    文中提到的通過反編譯獲得源碼:
    HelloWorld.groovy編譯為HelloWorld.class,然后將HelloWorld.class反編譯為HelloWorld.java

    HelloWorld.groovy的源碼:
    class?HelloWorld?{
    ????
    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;
    ????}
    }



    附:通過與Java的比較,迅速掌握Groovy
    posted on 2007-03-03 01:16 山風小子 閱讀(9780) 評論(14)  編輯  收藏 所屬分類: Groovy & Grails
    主站蜘蛛池模板: 2020因为爱你带字幕免费观看全集 | a级成人毛片免费视频高清| 国产三级在线观看免费| 亚洲人成毛片线播放| 成年人网站免费视频| 亚洲国产成AV人天堂无码| 免费人成网站在线观看10分钟| 亚洲欧洲精品国产区| 国产人在线成免费视频| 亚洲免费福利在线视频| 免费高清小黄站在线观看| 久久亚洲AV成人无码国产电影| 四虎永久免费网站免费观看| 黄色片网站在线免费观看| 久久精品国产亚洲7777| 光棍天堂免费手机观看在线观看| 亚洲国产日韩在线视频| 久久国产色AV免费看| 在线a亚洲老鸭窝天堂av高清| 曰皮全部过程视频免费国产30分钟 | 免费国产怡红院在线观看| 一级毛片在线完整免费观看| 久久激情亚洲精品无码?V| 久久久久免费看成人影片| 亚洲看片无码在线视频| 亚洲第一永久AV网站久久精品男人的天堂AV | 日韩精品亚洲专区在线影视| 亚洲毛片不卡av在线播放一区| 成人黄网站片免费视频| 国产成人精品亚洲日本在线| 国产禁女女网站免费看| 日本高清不卡aⅴ免费网站| 亚洲毛片无码专区亚洲乱| 免费国产综合视频在线看| 久久国产精品成人免费| 中文字幕亚洲精品无码| 亚洲国产美女精品久久久久∴| 国产麻豆视频免费观看| A国产一区二区免费入口| 亚洲国产精品免费观看 | 曰批免费视频播放免费|