With the GroovyClassLoader
we can load Groovy scripts and run them in Java code. First we must create a new GroovyClassLoader
and then parse a Groovy script. The script can be in a file, string or inputstream. Once the script is parsed we have a Class
and we can make a new instance of this class. We cast the instance to a GroovyObject
instance, so we can use the invokeMethod()
method to invoke methods in our Groovy script.
package com.mrhaki.blog; import groovy.lang.GroovyClassLoader; import groovy.lang.GroovyObject; import java.io.File; import java.io.IOException; public class GroovyRun { public static void main(final String[] args) throws IllegalAccessException, InstantiationException, IOException { // Create GroovyClassLoader. final GroovyClassLoader classLoader = new GroovyClassLoader(); // Create a String with Groovy code. final StringBuilder groovyScript = new StringBuilder(); groovyScript.append("class Sample {"); groovyScript.append(" String sayIt(name) { \"Groovy says: Cool $name!\" }"); groovyScript.append("}"); // Load string as Groovy script class. Class groovy = classLoader.parseClass(groovyScript.toString()); GroovyObject groovyObj = (GroovyObject) groovy.newInstance(); String output = groovyObj.invokeMethod("sayIt", new Object[] { "mrhaki" }); assert "Groovy says: Cool mrhaki!".equals(output); // Load Groovy script file. groovy = classLoader.parseClass(new File("SampleScript.groovy")); groovyObj = (GroovyObject) groovy.newInstance(); output = groovyObj.invokeMethod("scriptSays", new Object[] { "mrhaki", new Integer(2) }); assert "Hello mrhaki, from Groovy. Hello mrhaki, from Groovy. ".equals(output); } }
// File: SampleScript.groovy class SampleScript { String scriptSays(name, num) { "Hello $name, from Groovy. " * num } }