Calling a Groovy function from Java

后端 未结 6 1681
猫巷女王i
猫巷女王i 2020-12-05 04:56

How do you call a function defined in a Groovy script file from Java?

Example groovy script:

def hello_world() {
   println \"Hello, world!\"
}
         


        
6条回答
  •  有刺的猬
    2020-12-05 05:17

    Assuming you have a file called test.groovy, which contains (as in your example):

    def hello_world() {
       println "Hello, world!"
    }
    

    Then you can create a file Runner.java like this:

    import groovy.lang.GroovyShell ;
    import groovy.lang.GroovyClassLoader ;
    import groovy.util.GroovyScriptEngine ;
    import java.io.File ;
    
    class Runner {
      static void runWithGroovyShell() throws Exception {
        new GroovyShell().parse( new File( "test.groovy" ) ).invokeMethod( "hello_world", null ) ;
      }
    
      static void runWithGroovyClassLoader() throws Exception {
        // Declaring a class to conform to a java interface class would get rid of
        // a lot of the reflection here
        Class scriptClass = new GroovyClassLoader().parseClass( new File( "test.groovy" ) ) ;
        Object scriptInstance = scriptClass.newInstance() ;
        scriptClass.getDeclaredMethod( "hello_world", new Class[] {} ).invoke( scriptInstance, new Object[] {} ) ;
      }
    
      static void runWithGroovyScriptEngine() throws Exception {
        // Declaring a class to conform to a java interface class would get rid of
        // a lot of the reflection here
        Class scriptClass = new GroovyScriptEngine( "." ).loadScriptByName( "test.groovy" ) ;
        Object scriptInstance = scriptClass.newInstance() ;
        scriptClass.getDeclaredMethod( "hello_world", new Class[] {} ).invoke( scriptInstance, new Object[] {} ) ;
      }
    
      public static void main( String[] args ) throws Exception {
        runWithGroovyShell() ;
        runWithGroovyClassLoader() ;
        runWithGroovyScriptEngine() ;
      }
    }
    

    compile it with:

    $ javac -cp groovy-all-1.7.5.jar Runner.java 
    Note: Runner.java uses unchecked or unsafe operations.
    Note: Recompile with -Xlint:unchecked for details.
    

    (Note: The warnings are left as an exercise to the reader) ;-)

    Then, you can run this Runner.class with:

    $ java -cp .:groovy-all-1.7.5.jar Runner
    Hello, world!
    Hello, world!
    Hello, world!
    

提交回复
热议问题