Différents types d'exécution Groovy en Java


J'ai 3 questions concernant l'utilisation de Groovy en java. Ils sont tous liés ensemble, donc je ne crée qu'une question ici.

1) Il y a: GroovyClassLoader, GroovyShell, GroovyScriptEngine. Mais quelle est la différence entre eux?

Par exemple pour ce code:

static void runWithGroovyShell() throws Exception {
    new GroovyShell().parse(new File("test.groovy")).invokeMethod("hello_world", null);
}

static void runWithGroovyClassLoader() throws Exception {
    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 {
    Class scriptClass = new GroovyScriptEngine(".").loadScriptByName("test.groovy");
    Object scriptInstance = scriptClass.newInstance();
    scriptClass.getDeclaredMethod("hello_world", new Class[]{}).invoke(scriptInstance, new Object[]{});
}

2) Quelle est la meilleure façon de charger le script groovy afin qu'il reste en mémoire sous la forme compilée, puis je peux appeler une fonction dans ce script quand j'ai besoin de.

3) Comment exposer mes méthodes/classes java au script groovy afin qu'il puisse les appeler en cas de besoin?

Author: NewProger, 2012-12-07

1 answers

Les méthodes 2 et 3 renvoient toutes deux le class analysé en retour. Vous pouvez donc utiliser un map pour les garder en mémoire une fois qu'ils sont analysés et chargés avec succès.

Class scriptClass = new GroovyClassLoader().parseClass(new File("test.groovy"));
map.put("test.groovy",scriptClass);

MISE À JOUR:

GroovyObject lien vers les documents de l'objet groovy.

Il est également possible de lancer l'objet directement car GroovyObject et les autres classes java sont indiscernables.

Object aScript = clazz.newInstance();
MyInterface myObject = (MyInterface) aScript;
myObject.interfaceMethod();
 //now here you can also cache the object if you want to

Ne peut pas commenter l'efficacité. Mais je suppose que si vous gardez les classes chargées en mémoire, une fois l'analyse ne ferait pas beaucoup de mal.

MISE À JOUR Pour l'efficacité: Vous devez utiliser GroovyScriptEngine, il utilise la mise en cache de script en interne.

Voici le lien: Moteur de script Groovy

Sinon, vous pouvez toujours le tester en utilisant vous-même des benchmarks de performance et vous auriez une idée approximative. Par exemple: Compiler des scripts groovy avec les trois méthodes dans trois boucles différentes et voir ce qui fonctionne le mieux. Essayez d'utiliser des scripts identiques et différents, pour voir si la mise en cache coups de pied dans, d'une certaine façon.

MISE À JOUR POUR PASSER DES PARAMÈTRES VERS ET DEPUIS LE SCRIPT Binding class vous aidera à envoyer les paramètres vers et depuis le script.

Exemple De Lien

// setup binding
def binding = new Binding()
binding.a = 1
binding.setVariable('b', 2)
binding.c = 3
println binding.variables

// setup to capture standard out
def content = new StringWriter()
binding.out = new PrintWriter(content)

// evaluate the script
def ret = new GroovyShell(binding).evaluate('''
def c = 9
println 'a='+a
println 'b='+b
println 'c='+c 
retVal = a+b+c
a=3
b=2
c=1
''')

// validate the values
assert binding.a == 3
assert binding.getVariable('b') == 2
assert binding.c == 3 // binding does NOT apply to def'd variable
assert binding.retVal == 12 // local def of c applied NOT the binding!

println 'retVal='+binding.retVal
println binding.variables
println content.toString()
 2
Author: Narendra Pathai, 2012-12-08 12:57:11