Groovy和Java代码的混合

运行Groovy代码


运行Groovy代码,有两种方法:

  1. 直接使用groovy filename命令,它会在内存中直接编译代码运行,而不会生成什么编译文件。
    假设在桌面上有一个名为hello.groovy文件:

    /*======hello.groovy==========*/
    
    def prompt="Press your name:"
    def console=System.console()
    def name=new String(console.readLine(prompt,null))
    for (;name=="";name=new String(console.readLine(prompt,null))){
        println "input can't be empty";
    }
    println "hello! Mr.$name"
    

    则在命令行中(切换到所在目录):

    C:\Users\Berlin\Desktop>groovy hello
    Press your name:
    input can't be empty
    Press your name:Andrew
    hello! Mr.Andrew
    
    C:\Users\Berlin\Desktop>
    
  2. 使用groovyc命令(类似javac命令)将其显式的编译为.class文件,然后使用java命令运行。
    这里有几点需要注意:

    • 因为没有包声明,则使用groovyc命令时可以用-d来指定.class文件的输出路径。
    • 使用java命令运行时,要将%GROOVY_HOME%\embeddable\groovy-all-2.4.12.jar这个包加入-classpath类搜索路径中去,其中%GROOVY_HOME%是安装Groovy时的环境变量,在我的机器上是C:\Program Files\Groovy\groovy-2.4.12
    • 有一个点请注意,上面命令不能直接写为java -classpath %GROOVY_HOME%\embeddable......,这是因为展开后就变成了java -classpath C:\Program Files\Groovy\groovy-2.4.12\embeddable......,因为其中包括一个空格(C:\Program Files)从而会将C:\Program认为是一个路径,解决办法是使用双引号括起来:java -classpath "%GROOVY_HOME%\embeddable......" .....
    • java -classpath后面如果依赖多个路径,将路径用分号分隔
    • java命令最后跟要运行的class文件,但是有时会出现“无法加载类或找不到主类”的错误提示,一个解决办法是,将class文件所在路径加入到-classpath的路径中去。

    作为例子,展示一个使用拓展模块定制自己的拓展方法。
    在Groovy中可以给一个类添加拓展方法,既可以是实例方法(其中有this指针)也可以是静态方法。这分为两步:

    1. 首先,将所有方法放入一个包装类中,但是必须都声明为(该包装类的)静态方法。而这个方法(对于被拓展类)到底是实例方法还是静态方法要在清单文件中设置。这些方法,第一个参数是被拓展类类型,尔后的参数都是要传入这个方法的参数。事实上,可以想象其中的调用原理,例如在StringExtension包装类中拓展一个String方法,作用是将字符串全部转为大/小写并打印:def static unifyFormatAndPrint(String str,boolean isUppercase),调用时"hello Bob".unifyFormatAndPrint(true),内部实际上是StringExtension.unifyFormatAndPrint("hello Bob",true)。当然如果是一个(对被拓展类而言的)静态方法,则第一个参数就没有用了(当然必须得有)。
      这个文件如下所示:
       //MyStringExtension.groovy
        class StringExtension{
             def static unifyFormatAndPrint(String str,boolean isUppercase){
                  if(isUppercase)
                     println str.toUpperCase()
                  else
                     println str.toLowerCase()
             }
         }
      
    2. 接下来在清单文件中声明其存在,在任意位置建一个文件夹,在该文件夹下放置如下的目录结构:
      新建文件夹/META-INF/services/org.codehaus.groovy.runtime.ExtensionModule
      在其中做如下声明:
      moduleName=string_extension //自己制定的模块名
      moduleVersion=1.0-SNAPSHOT //自己制定的版本号
      extensionClasses=StringExtension //逗号分隔的实例方法所在的包装类
      //extensionStaticClasses=.....  //逗号分隔的实例方法所在的包装类
      
    3. 使用groovyc命令将文件先编译:
      Groovy和Java代码的混合_第1张图片
    4. 然后使用jar命令生成jar包
      Groovy和Java代码的混合_第2张图片

      其中-cf后指定输出的包名,-C classes . -C 新建文件夹 .表示到暂时切换到该目录下(注意不是-c),后面的点号(.)表示在当前目录下搜索。
    5. 下面开始使用这个包,新建一个Groovy文件:
        //use.groovy
        "hello Bon".unifyFormatAndPrint(true)
      
      使用groovyc编译,groovyc -d classes use.groovy
      然后使用java命令开始运行,注意上面提到的注意事项:
      java -classpath "%GROOVY_HOME%\embeddable\groovy-all-2.4.12.jar";ext.jar;classes use
      【需要用到groovy-all-2.4.12.jar包以及刚才自己定义的拓展方法包ext.jar,以及class文件路径classes。注意!!分号后面不要留空格!;ext.jar;classes不能写成; ext.jar; classes

联合编译


你可能感兴趣的:(Groovy和Java代码的混合)